Во-первых, вы не хотите делать это .Удаление элементов из list
(или любого контейнера) в середине for
на основе диапазона - это рецепт катастрофы, поскольку , скрытый за циклом for
, является итераторами , которые будут недействительными, как толькокак элемент удален
Это та же проблема, что и во втором эксперименте с
for (auto iter = tuple_list.begin(); iter != tuple_list.end(); iter++)
{
tuple_list.erase(iter); // iter rendered invalid.
// That makes iter++ and iter != tuple_list.end()
// totally bogus.
}
Эта версия может быть исправлена с помощью
for (auto iter = tuple_list.begin(); iter != tuple_list.end(); /* nothing here */)
{
iter = tuple_list.erase(iter); // iter updated here
}
или
while (! tuple_list.empty())
{
tuple_list.pop_front();
}
Или
tuple_list.clear();
ОК.О том, что пошло не так:
ошибка C2678: двоичный файл '==': не найден оператор, который принимает левый операнд типа 'const _Ty' (или нет приемлемого преобразования)
означает, что одну из частей кортежа нельзя сравнивать на равенство.
struct A
{
};
не имеет оператора равенства.Решение состоит в том, чтобы добавить один.
struct A
{
};
bool operator==(const A& lhs, const A& rhs)
{
Comparison logic goes here
}
Полезное дополнительное чтение:
Идиома Erase-Remove может использоваться для решения подобных проблем.