Accelerated c++上的一道习题,求指导 啊
假设 m 类型是map<int,string>,而且我们遇到了一个调用copy(m.begin(),m.end(),back_inserter(x)),那么我们应该怎样看待 x 的类型?如果这个调用的形式是copy(x.begin(),x.end(),back_inserter(m))的话又怎样?
望有懂的大神指导一下啊,亲!
back_inserter(x) 是一个迭代器适配器(就你这本书的p88页就有)
它是一个函数,参数x是一个容器,这个函数会返回一个迭代器
copy(m.begin(),m.end(),back_inserter(x))它的作用是把容器m的所有成员全部添加到容器x的末尾!
其它的你仔细看p88页吧,是书的“第6章 使用库算法”!! 只爱你一人 发表于 2014-11-16 11:33
back_inserter(x) 是一个迭代器适配器(就你这本书的p88页就有)
它是一个函数,参数x是一个容器,这个函 ...
我知道这个函数和back_inserter的作用,主要是X应该是个什么类型?
如果我把X定义成vector,编译会出错,如果定义成map,就会提示map不能调用back_inserter.
反正就是找不到一个合适的类型来正确处理题目中的情况 关联式容器map不能使用back_inserter(),
copy(x.begin(), x.end(), back_inserter(m))其中x和m必须是同一类型吧!
是哪一题啊? #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="aaa";
m="bbb";
m="ccc";
m="ddd";
}
void show( const vector<pair<int, string> >& x ) {
for( int i=0;i<x.size();++i ) {
cout<<x.first<<":"<<x.second<<endl;
}
} 贴个可以运行的代码,剩下的LZ自己想吧 仰望天上的光 发表于 2014-11-20 15:49
谢过大神的帮助了!!Thanks
这个代码可以搞明白,map类型的m不能调用back_inserter,是不是copy(x.begin(),x.end(),back_inserter(m))
这个调用形式本身就是不对的啊?还是有怎样的实现方法可以这样用back_inserter; 追忆lh 发表于 2014-11-20 18:25
谢过大神的帮助了!!Thanks
这个代码可以搞明白,map类型的m不能调用back_inserter,是不是copy(x.be ...
。。。你没看过back_inserter的实现吗?调用这个需要容器支持push_back()操作,事实上,就是把copy算法中的赋值=运算修改成了push_back()操作。 还是贴个代码吧,意思就是无论什么容器,只要形式上具有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.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")));
} 仰望天上的光 发表于 2014-11-20 18:45
。。。你没看过back_inserter的实现吗?调用这个需要容器支持push_back()操作,事实上,就是把copy算法 ...
我知道是这样的,那copy(x.begin(),x.end(),back_inserter(m))的意义何在啊?既然map不支持back_inserter,为何还要那样调用,难倒这题是为了让我知道这样是不对的吗?O.O 追忆lh 发表于 2014-11-21 09:31
我知道是这样的,那copy(x.begin(),x.end(),back_inserter(m))的意义何在啊?既然map不支持back_inserter ...
是要让你知道,放在back_inserter里的容器必须支持push_back操作,只要含有push_back操作就可以放进去 仰望天上的光 发表于 2014-11-21 12:52
是要让你知道,放在back_inserter里的容器必须支持push_back操作,只要含有push_back操作就可以放进去
好吧,O.O多谢…………………… 仰望天上的光 发表于 2014-11-20 22:10
还是贴个代码吧,意思就是无论什么容器,只要形式上具有push_back函数,就可以用back_inserter,下面代码我 ...
牛人,这我都还没接触呢,路还很遥远啊……,多谢多谢
页:
[1]