鱼C论坛

 找回密码
 立即注册
查看: 2013|回复: 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))的话又怎样?


望有懂的大神指导一下啊,亲!
小甲鱼最新课程 -> https://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章 使用库算法”!!
小甲鱼最新课程 -> https://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.
反正就是找不到一个合适的类型来正确处理题目中的情况
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

  7. void init_map( map<int,string>& m );
  8. void show( const vector<pair<int, string> >& x );
  9. int main() {
  10.         map<int,string> m;
  11.         init_map(m);
  12.         vector<pair<int, string> > x;
  13.         copy(m.begin(),m.end(),back_inserter(x));
  14.         show(x);
  15. }

  16. void init_map( map<int,string>& m ) {
  17.         m[0]="aaa";
  18.         m[1]="bbb";
  19.         m[2]="ccc";
  20.         m[3]="ddd";
  21. }

  22. void show( const vector<pair<int, string> >& x ) {
  23.         for( int i=0;i<x.size();++i ) {
  24.                 cout<<x[i].first<<":"<<x[i].second<<endl;
  25.         }
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-20 15:49:52 | 显示全部楼层
贴个可以运行的代码,剩下的LZ自己想吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢过大神的帮助了!!Thanks

这个代码可以搞明白,map类型的m不能调用back_inserter,是不是copy(x.begin(),x.end(),back_inserter(m))
这个调用形式本身就是不对的啊?还是有怎样的实现方法可以这样用back_inserter;
小甲鱼最新课程 -> https://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()操作。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  7. void init_vec( vector<pair<int,string> >& m );

  8. class MyMap:public map< int , string > {
  9. public:
  10.         void push_back( const pair<int,string>& n ) {
  11.                 (*this)[n.first] = n.second;
  12.         }
  13.         void show() const{
  14.                 typedef const_iterator CIT;
  15.                 for( CIT it = begin(); it != end(); ++it ) {
  16.                         cout << it->first<<":"<<it->second<<endl;
  17.                 }
  18.         }
  19. };

  20. int main() {
  21.         vector<pair<int,string> > x;
  22.         init_vec(x);
  23.         MyMap m;
  24.         copy(x.begin(), x.end(), back_inserter(m));
  25.         m.show();
  26. }

  27. void init_vec( vector<pair<int,string> >& m ) {
  28.         m.push_back(make_pair(1,string("aaa")));
  29.         m.push_back(make_pair(2,string("bbb")));
  30.         m.push_back(make_pair(3,string("ccc")));
  31. }
复制代码
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://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操作就可以放进去
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好吧,O.O多谢……………………
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

牛人,这我都还没接触呢,路还很遥远啊……,多谢多谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-18 05:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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