| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5077 人关注过本帖, 1 人收藏
标题:利用函数对象机制遍历vector问题
只看楼主 加入收藏
hcs_xiaohan
Rank: 2
等 级:论坛游民
帖 子:40
专家分:23
注 册:2016-7-4
结帖率:91.67%
收藏(1)
已结贴  问题点数:10 回复次数:10 
利用函数对象机制遍历vector问题
书上的代码是这样的:


template<typename T,typename VST>
void vector<T>::taverse(VST & visit) //函数对象
{ for(int i=0;i<_size;i++) visit(_element[i]); }

我能看懂但是不会用,可不可以用这段代码举个例子给我看看,比如实现向量元素加一?
搜索更多相关主题的帖子: visit 
2016-09-19 13:05
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:4 
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<int> instance;
    int i;
    for(i=0;i<10;i++) instance.push_back(i);
    vector<int>::iterator itr;
    for(itr=instance.begin();itr<instance.end();itr++)
        cout<<*itr;//输出
    cout<<endl;
    for(itr=instance.begin();itr<instance.end();itr++)
        (*itr)++;//各元素加一
    for(itr=instance.begin();itr<instance.end();itr++)
        cout<<*itr;//再输出
    return 0;
}
向量各元素加一,是指这个意思么?
2016-09-19 21:54
hcs_xiaohan
Rank: 2
等 级:论坛游民
帖 子:40
专家分:23
注 册:2016-7-4
收藏
得分:0 
回复 2楼 yangfrancis
不是啊,你这段代码太简单了。能不能用我的提问里的函数对象机制实现一遍给我看看?
2016-09-19 23:05
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:4 
楼主要的东西估计是模板的示范应用吧。



φ(゜▽゜*)♪
2016-09-20 09:39
hcs_xiaohan
Rank: 2
等 级:论坛游民
帖 子:40
专家分:23
注 册:2016-7-4
收藏
得分:0 
回复 4楼 书生牛犊
对啊,上面那个函数模板怎么用,你能举个例子给我看看吗?
2016-09-20 11:56
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:4 
首先,你这个 vector<T> 是自己写的,还是C++标准库中的?
若是标准库中的,根本就没有这个taverse函数;若是自己写的,得问写的人。

BTW:你这书比较烂吧,taverse这个成员函数的设计完全不符合C++的设计哲学.
C++是根据对象特性写算法,而那些垃圾的只能面向对象的语言才用这种丑陋的方式,或者使用同样丑陋的接口继承。
如果vector<T>要加一个taverse方法,那么list<T>、queue<T>、……等等是不是也要加,无数个容器就要加无数个一模一样的代码;
只能面向对象的垃圾语言想出了一个接口继承了办法,只要让它们继承同一个接口ITaverse就可以避免代码重复。但是又有新问题,下次想出个taverse2的话,岂不是又要将之前的库全加上ITaverse2,而且标准库不是自己可以私自改的。

C++中就很简单了,不多说,直接上代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;

int main()
{
    std::vector<int> a = { 1, 2, 3 };
    std::list<int> b = { 4, 5, 6 };
    int c[] = { 7, 8, 9 };
   
    auto visit = [](int v){ cout<<v<<'\n'; };
   
    std::for_each( std::begin(a), std::end(a), visit );
    std::for_each( std::begin(b), std::end(b), visit );
    std::for_each( std::begin(c), std::end(c), visit );
   
    // or
   
    for( auto v : a ) visit(v);
    for( auto v : b ) visit(v);
    for( auto v : c ) visit(v);
   
    return 0;
}
多么简洁美观呀,即使我自己写个新的容器,也可以不用作任何修改就直接使用std::for_each。

再看你的代码
template<typename T,typename VST>
void vector<T>::taverse(VST & visit) //函数对象
{ for(int i=0;i<_size;i++) visit(_element[i]); }
好多中文全角符号呀,而且下标竟然用int,自增竟然用后增,也不知道哪个歪歪老师教的
2016-09-20 16:14
hcs_xiaohan
Rank: 2
等 级:论坛游民
帖 子:40
专家分:23
注 册:2016-7-4
收藏
得分:0 
回复 6楼 rjsp
我把书上完整的内容贴给你看看:

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


这是出现在数据结构中向量这一节。它是用函数指针或函数对象遍历向量中的元素。然而我并没有看懂它这个实例,所以才有此问。
你能帮我解释一下这个实例吗?还有这种遍历方法很烂吗?
2016-09-20 16:38
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 5楼 hcs_xiaohan
不好意思,我知道你想问什么,但是我自己也只是刚刚才开始学C++,还没学到这一部分,完全不能理解这个模板到底干什么用。

所以我才给你把问题转移到C++论坛板块来。我要是懂的话,在就在算法板块给你解决了。不好意思了。我学编程到现在还不满一年,能力非常低,“版主”是个意外。。没多少干货的。


----------------------------------
目前来说,通过rjsp版主的举例说明,我好像有点明白了。模板貌似就一个fun()函数,里面执行了若干操作(比如把元素自增)。我们可以通过反复调用这个fun()函数来达到对不同对象的机械性重复操作。
but,专门搞这么一个template<typename>做这样的事,,感觉不如直接在for()循环里面写代码来着容易让人理解呢。

应该不至于专门设计这样一个无聊的语法来干这么无聊的事吧。我第一次看到C++的for each 循环的时候,觉得很赞,他比C语言的for语句省了一些东西,能够自己主动去执行区间判定、迭代等等,很棒。
没理由在搞一个template<>来替代for each 。
就楼主给出的树上的截图来看,重载了increase() 为元素位移,但是我蛮质疑这个位移有没有机制去限制它不会越界?我学C出身的,所以会特别在意指针问题。我怀疑楼主的那个书上的代码存在越界的隐患,甚至这个越界还是个无限循环,木得终止,只待奔溃。

很多人很多地方都说C++是门学不精的手艺,所以我感觉这个template估计就是其中一个,至少他不会那么肤浅去替代for each,他应该有他的应用场景。应该不这么用吧。(猜的,编程是门科学,用猜的,很不礼貌。但,能力有限...)



[此贴子已经被作者于2016-9-23 17:00编辑过]


φ(゜▽゜*)♪
2016-09-23 16:42
hcs_xiaohan
Rank: 2
等 级:论坛游民
帖 子:40
专家分:23
注 册:2016-7-4
收藏
得分:0 
回复 8楼 书生牛犊
不好意思现在才看到你的回复。
书上的截图increase()函数功能不是元素位移,而是实现向量所有元素加一操作。比如一个向量v[5]={1,2,3,4,5},increase()之后得到的结果应是
v{5]={2,3,4,5,6}。应该不存在越界的问题。
2016-09-28 12:32
Jimmy_xu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-4-4
收藏
得分:0 
回复 6楼 rjsp
算法源自<<数据结构(C++语言版)>> 是为清华大学计算机系列教材 编者邓俊辉教授.
2020-04-04 18:23
快速回复:利用函数对象机制遍历vector问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014513 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved