鱼C论坛

 找回密码
 立即注册
查看: 1643|回复: 12

Accelerated c++上的一道习题,求指导 啊

[复制链接]
发表于 2014-11-16 10:44:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
假设 m 类型是map<int,string>,而且我们遇到了一个调用copy(m.begin(),m.end(),back_inserter(x)),那么我们应该怎样看待 x 的类型?
如果这个调用的形式是copy(x.begin(),x.end(),back_inserter(m))的话又怎样?


望有懂的大神指导一下啊,亲!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-16 11:33:43 | 显示全部楼层
back_inserter(x)   是一个迭代器适配器(就你这本书的p88页就有)
它是一个函数,参数x是一个容器,这个函数会返回一个迭代器
copy(m.begin(),m.end(),back_inserter(x))它的作用是把容器m的所有成员全部添加到容器x的末尾!
其它的你仔细看p88页吧,是书的“第6章 使用库算法”!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-19 21:53:54 | 显示全部楼层
只爱你一人 发表于 2014-11-16 11:33
back_inserter(x)   是一个迭代器适配器(就你这本书的p88页就有)
它是一个函数,参数x是一个容器,这个函 ...

我知道这个函数和back_inserter的作用,主要是X应该是个什么类型?
如果我把X定义成vector,编译会出错,如果定义成map,就会提示map不能调用back_inserter.
反正就是找不到一个合适的类型来正确处理题目中的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 14:29:41 | 显示全部楼层
关联式容器map不能使用back_inserter(),
copy(x.begin(), x.end(), back_inserter(m))其中x和m必须是同一类型吧!
是哪一题啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 15:49:31 | 显示全部楼层
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

void init_map( map<int,string>& m );
void show( const vector<pair<int, string> >& x );
int main() {
        map<int,string> m;
        init_map(m);
        vector<pair<int, string> > x;
        copy(m.begin(),m.end(),back_inserter(x));
        show(x);
}

void init_map( map<int,string>& m ) {
        m[0]="aaa";
        m[1]="bbb";
        m[2]="ccc";
        m[3]="ddd";
}

void show( const vector<pair<int, string> >& x ) {
        for( int i=0;i<x.size();++i ) {
                cout<<x[i].first<<":"<<x[i].second<<endl;
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 15:49:52 | 显示全部楼层
贴个可以运行的代码,剩下的LZ自己想吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-20 18:25:17 | 显示全部楼层

谢过大神的帮助了!!Thanks

这个代码可以搞明白,map类型的m不能调用back_inserter,是不是copy(x.begin(),x.end(),back_inserter(m))
这个调用形式本身就是不对的啊?还是有怎样的实现方法可以这样用back_inserter;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 18:45:04 | 显示全部楼层
追忆lh 发表于 2014-11-20 18:25
谢过大神的帮助了!!Thanks

这个代码可以搞明白,map类型的m不能调用back_inserter,是不是copy(x.be ...

。。。你没看过back_inserter的实现吗?调用这个需要容器支持push_back()操作,事实上,就是把copy算法中的赋值=运算修改成了push_back()操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 22:10:14 | 显示全部楼层
还是贴个代码吧,意思就是无论什么容器,只要形式上具有push_back函数,就可以用back_inserter,下面代码我自己继承并修改了map,就OK了
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
 
void init_vec( vector<pair<int,string> >& m );

class MyMap:public map< int , string > {
public:
        void push_back( const pair<int,string>& n ) {
                (*this)[n.first] = n.second;
        }
        void show() const{
                typedef const_iterator CIT;
                for( CIT it = begin(); it != end(); ++it ) {
                        cout << it->first<<":"<<it->second<<endl;
                }
        }
};

int main() {
        vector<pair<int,string> > x;
        init_vec(x);
        MyMap m;
        copy(x.begin(), x.end(), back_inserter(m));
        m.show();
}

void init_vec( vector<pair<int,string> >& m ) {
        m.push_back(make_pair(1,string("aaa")));
        m.push_back(make_pair(2,string("bbb")));
        m.push_back(make_pair(3,string("ccc")));
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-21 09:31:45 | 显示全部楼层
仰望天上的光 发表于 2014-11-20 18:45
。。。你没看过back_inserter的实现吗?调用这个需要容器支持push_back()操作,事实上,就是把copy算法 ...

我知道是这样的,那copy(x.begin(),x.end(),back_inserter(m))的意义何在啊?既然map不支持back_inserter,为何还要那样调用,难倒这题是为了让我知道这样是不对的吗?O.O
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-21 12:52:01 | 显示全部楼层
追忆lh 发表于 2014-11-21 09:31
我知道是这样的,那copy(x.begin(),x.end(),back_inserter(m))的意义何在啊?既然map不支持back_inserter ...

是要让你知道,放在back_inserter里的容器必须支持push_back操作,只要含有push_back操作就可以放进去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-21 14:39:14 | 显示全部楼层
仰望天上的光 发表于 2014-11-21 12:52
是要让你知道,放在back_inserter里的容器必须支持push_back操作,只要含有push_back操作就可以放进去

好吧,O.O多谢……………………
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-21 20:31:11 | 显示全部楼层
仰望天上的光 发表于 2014-11-20 22:10
还是贴个代码吧,意思就是无论什么容器,只要形式上具有push_back函数,就可以用back_inserter,下面代码我 ...

牛人,这我都还没接触呢,路还很遥远啊……,多谢多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 10:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表