首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为何VC10的lambda[](&)函数用于map容器会引起拷贝?该怎么解决

2012-04-15 
为何VC10的lambda[](&)函数用于map容器会引起拷贝?我知道,在lambda函数中,如果()里面加上&就是引用迭代变

为何VC10的lambda[](&)函数用于map容器会引起拷贝?
我知道,在lambda函数中,如果()里面加上&就是引用迭代变量,不会引起变量拷贝,如下:

C/C++ code
struct s{    int a,b;    s():a(1),b(2){cout<<"ctor"<<endl;}    s(const s& ss){a=ss.a;b=ss.b;cout<<"copy ctor"<<endl;}    s& operator=(const s& ss){a=ss.a;b=ss.b;cout<<"operator="<<endl;return *this;}};void main(void){    vector<s> ms;    ms.push_back(s());    ms.push_back(s());    cout<<"========================================\n";    for_each(ms.begin(),ms.end(),[](s& p){cout<<p.a<<p.b<<'\n';});    cout<<"========================================\n";    for(auto it=ms.begin();it!=ms.end();++it){        cout<<it->a<<it->b<<'\n';    }}

上面这段代码打印输出:
ctor
copy ctor
ctor
copy ctor
copy ctor
========================================
12
12
========================================
12
12

到此为止都没有问题,如果我的lambda函数写成了: [](s p){cout<<p.a<<p.b<<'\n';});就会引起拷贝,运行输出:
ctor
copy ctor
ctor
copy ctor
copy ctor
========================================
copy ctor
12
copy ctor
12
========================================
12
12

但是我发现,如果我不用vector而是用map的话,即使lambda函数的()里面用了&,还是会引起对象拷贝,这是为什么呢? 如下代码:
C/C++ code
struct s{    int a,b;    s():a(1),b(2){cout<<"ctor"<<endl;}    s(const s& ss){a=ss.a;b=ss.b;cout<<"copy ctor"<<endl;}    s& operator=(const s& ss){a=ss.a;b=ss.b;cout<<"operator="<<endl;return *this;}};void main(void){    map<int,s> ms;    ms.insert(make_pair(1,s()));    ms.insert(make_pair(2,s()));    cout<<"========================================\n";    for_each(ms.begin(),ms.end(),[](const pair<int,s>& p){cout<<p.second.a<<p.second.b<<'\n';});    cout<<"========================================\n";    for(auto it=ms.begin();it!=ms.end();++it){        cout<<it->second.a<<it->second.b<<'\n';    }}


打印输出:
ctor
copy ctor
copy ctor
ctor
copy ctor
copy ctor
========================================
copy ctor
12
copy ctor
12
========================================
12
12
很显然,for_each函数里面的pair被拷贝了。这是为什么呢?


[解决办法]
必须有一个copy
map<int, s>::value_type 猜猜这是什么?
答对了。是pair<const int, s>,map的key就是const的
[解决办法]
C/C++ code
template<typename T1, typename T2>struct pair{    //..............    template<typename Other1, typename Other2>    pair(const pair<Other1, Other2>& s);   //pair<const int, s> p = pair<int, s>();}; 

热点排行