追忆lh 发表于 2014-11-16 10:44:36

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

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


望有懂的大神指导一下啊,亲!

只爱你一人 发表于 2014-11-16 11:33:43

back_inserter(x)   是一个迭代器适配器(就你这本书的p88页就有)
它是一个函数,参数x是一个容器,这个函数会返回一个迭代器
copy(m.begin(),m.end(),back_inserter(x))它的作用是把容器m的所有成员全部添加到容器x的末尾!
其它的你仔细看p88页吧,是书的“第6章 使用库算法”!!

追忆lh 发表于 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.
反正就是找不到一个合适的类型来正确处理题目中的情况

只爱你一人 发表于 2014-11-20 14:29:41

关联式容器map不能使用back_inserter(),
copy(x.begin(), x.end(), back_inserter(m))其中x和m必须是同一类型吧!
是哪一题啊?

仰望天上的光 发表于 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="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;
        }
}

仰望天上的光 发表于 2014-11-20 15:49:52

贴个可以运行的代码,剩下的LZ自己想吧

追忆lh 发表于 2014-11-20 18:25:17

仰望天上的光 发表于 2014-11-20 15:49


谢过大神的帮助了!!Thanks

这个代码可以搞明白,map类型的m不能调用back_inserter,是不是copy(x.begin(),x.end(),back_inserter(m))
这个调用形式本身就是不对的啊?还是有怎样的实现方法可以这样用back_inserter;

仰望天上的光 发表于 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()操作。

仰望天上的光 发表于 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.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")));
}

追忆lh 发表于 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

仰望天上的光 发表于 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操作就可以放进去

追忆lh 发表于 2014-11-21 14:39:14

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

好吧,O.O多谢……………………

追忆lh 发表于 2014-11-21 20:31:11

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

牛人,这我都还没接触呢,路还很遥远啊……,多谢多谢
页: [1]
查看完整版本: Accelerated c++上的一道习题,求指导 啊