копирующий вектор пары - PullRequest
1 голос
/ 12 июня 2011

Я пытаюсь скопировать вектор пары в другой:

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

Использование gcc 4.5.1 в Ubuntu.

Ответы [ 2 ]

7 голосов
/ 12 июня 2011

как альтернатива ответу Конрада;если цель состоит в том, чтобы просто скопировать элементы первого вектора, если они соответствуют определенному условию, не будет ли 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 */; });
5 голосов
/ 12 июня 2011

Копирование гораздо проще, чем это:

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

или даже:

vector<pair<int,int>> vp2 = vp; // or
vector<pair<int,int>> vp2(vp);

Ошибка в вашем коде заключается в том, что вы захватываете vp2 по значению который фактически делает его const в вашем анонимном методе, и вы не можете вызвать push_back для const vector.Должно работать следующее:

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

Но нет причин использовать это вместо более простого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...