复制对的矢量

bad*_*ash 1 c++ vector c++11

我试图将一对矢量复制到另一个:

vector<pair<int,int>> vp = {pair<int,int>(1,1), pair<int,int>(2,2)};
vector<pair<int,int>> vp2;
for_each(vp.begin(), vp.end(), [vp2](pair<int,int> p){
                                               if(/*some condition*/){
                                                vp2.push_back(p);
                                               }
                                              });
Run Code Online (Sandbox Code Playgroud)

我得到这个编译器错误:

error: passing ‘const std::vector<std::pair<int, int> >’ as ‘this’ argument of ‘void std::vector<_Tp, _Alloc>::push_back(value_type&&) [with _Tp = std::pair<int, int>, _Alloc = std::allocator<std::pair<int, int> >, value_type = std::pair<int, int>]’ discards qualifiers
Run Code Online (Sandbox Code Playgroud)

在ubuntu上使用gcc 4.5.1.

Sve*_*ven 7

作为康拉德答案的替代品; 如果目标只是复制第一个向量的元素,如果它们匹配某个条件,那么std::copy_if不是更好的匹配吗?

vector<pair<int,int>> vp = {pair<int,int>(1,1), pair<int,int>(2,2)};
vector<pair<int,int>> vp2;

copy_if(vp.begin(), vp.end(), back_inserter(vp2), [](pair<int,int> p) { return /* some condition */; });
Run Code Online (Sandbox Code Playgroud)


Kon*_*lph 5

复制比这容易得多:

vector<pair<int,int>> vp2(vp.begin(), vp.end());
Run Code Online (Sandbox Code Playgroud)

甚至:

vector<pair<int,int>> vp2 = vp; // or
vector<pair<int,int>> vp2(vp);
Run Code Online (Sandbox Code Playgroud)

在你的代码中的错误是你捕捉vp2 的值,有效地使得它const在你的匿名方法,你可以不叫push_backconst vector.以下应该有效:

for_each(vp.begin(), vp.end(), [&vp2](pair<int,int> p){vp2.push_back(p);});
Run Code Online (Sandbox Code Playgroud)

但是没有理由使用它代替更简单的代码.