复制pair向量

3

我正在尝试将一个pair向量复制到另一个向量中:

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);
                                               }
                                              });

我遇到了这个编译器错误:

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

在Ubuntu上使用gcc 4.5.1。

2
这可能是一个愚蠢的问题,但 vp2 = vp 不就可以吗? - ereOn
@ereOn:他正在寻找一个“copy_if”。 - Inverse
2个回答

9
作为Konrad答案的替代方案;如果目标只是在满足某个条件的情况下复制第一个向量的元素,那么使用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 */; });

1
+1 for_each 几乎从来不是正确的答案,通常有更好的算法可以实现你想要做的事情。 - jk.

6

复制比那容易得多:

vector<pair<int,int>> vp2(vp.begin(), vp.end());

甚至更多:
vector<pair<int,int>> vp2 = vp; // or
vector<pair<int,int>> vp2(vp);

您的代码错误在于您通过值捕获了vp2,这实际上使它在匿名方法中成为了const,因此您无法在const vector上调用push_back。以下代码应该可以正常工作:
for_each(vp.begin(), vp.end(), [&vp2](pair<int,int> p){vp2.push_back(p);});

但是没有理由使用这个代码,而不是更简单的代码。


1
“vector<pair<int,int>> vp2( vp );”不是更简单吗? - user2100815
1
更好的写法是:vector<pair<int,int>> vp2(vp); - Yakov Galka
@ybungalobill 我不认为这样做更好(特别是因为有时会遇到最令人烦恼的解析问题)。但出于完整性考虑,我会提一下。 - Konrad Rudolph
然而,问题是如何使原始代码起作用。想象一下,OP希望在push_back之前以某种方式转换该值。 - Vlad
+1对于“但是没有理由使用这个而不是更简单的代码”。这是很友善地说。如果有IOC++11CC比赛,发布的代码将是一个很好的候选者。 - David Hammen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接