为何VC10的lambda[](&)函数用于map容器会引起拷贝?该怎么解决
为何VC10的lambda[](&)函数用于map容器会引起拷贝?
我知道,在lambda函数中,如果()里面加上&就是引用迭代变量,不会引起变量拷贝,如下:
上面这段代码打印输出:
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函数的()里面用了&,还是会引起对象拷贝,这是为什么呢? 如下代码:
打印输出:
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的
------解决方案--------------------
我知道,在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>(); };