Когда вы вызываете метод erase, который принимает только один итератор (не диапазон итераторов), а алгоритм std::remove_if
вызывается со вторым итератором диапазона элементов контейнера, указанного как
node->objectList.end()-1
тогда, даже если элемент не найден в контейнере, алгоритм remove_if
вернет итератор node->objectList.end()-1
, который указывает на действительный объект в контейнере. Этот объект будет удален из контейнера.
Вот демонстрационная программа, которая воспроизводит проблему.
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 1, 3, 5, 7, 9 };
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
while ( v.size() > 1 )
{
v.erase( std::remove_if( std::begin( v ), std::prev( std::end( v ) ),
[]( const auto &item )
{
return item % 2 == 0;
} ) );
}
for ( const auto &item : v ) std::cout << item << ' ';
std::cout << '\n';
return 0;
}
Ее вывод
1 3 5 7 9
1
Это не элемент в векторе четное число. Тем не менее, все элементы, кроме одного, были стерты из вектора.
Похоже, вы неправильно указали диапазон. Он должен быть указан как пара
node->objectList.begin(), node->objectList.end()
. Или перед удалением элемента вы должны проверить, равен ли возвращаемый итератор node->objectList.end() - 1
(при условии, что вы действительно хотите использовать диапазон, показанный в вашем вопросе). В этом случае метод erase не должен вызываться. Или вы должны указать стертый диапазон итераторов, например
if (!node->objectList.empty())
node->objectList.erase(std::remove_if(node->objectList.begin(), node->objectList.end()-1 , [&t](auto& temp) { return temp == t; }).
node->objectList.end()-1);
Снова при условии, что вы действительно хотите использовать второй итератор диапазона, например node->objectList.end()-1
вместо node->objectList.end()
.