ForwardIterator в сочетании с несколькими привязками выполняет итерацию слишком быстро - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу перебрать vector из int с и удалить все четные числа.

Пример:

std::vector<int> v = {5,2,9,3,8}

auto it = std::remove_if(v.begin(),v.end(), 
    std::bind(std::bind(std::equal_to<int>(),_1,0),
    std::bind(std::modulus<int>(),_1,2)));

Ожидаемый результат должен быть {5,9,3} Но это {5,8,9,3,8}

Я думаю, что Итератор уже в конце перед выполнением всех функций связывания и удаления.

Я знаю, какрешить ее по-другому, но я хочу знать, как использовать вложенную форму и как она работает с итераторами

1 Ответ

0 голосов
/ 31 декабря 2018

В VS2015 ваш код оставляет v, содержащий {5, 9, 3, 3, 8}.

std::remove_if() возвращает итератор для первого неиспользуемого элемента в vector, используйте этоусечь vector:

v.erase(it, v.end());

После этого v содержит {5, 9, 3}


В примечании, если вы хотите использоватьлямбда вместо bind вы можете сделать это так:

std::vector<int> v = { 5, 2, 9, 3, 8 };
auto it = std::remove_if(v.begin(), v.end(), [](int val) { return val % 2 == 0; });
v.erase(it, v.end());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...