У меня есть вектор, который я повторяю. Во время итерации я могу добавлять новые значения к вектору. Это выглядит примерно так:
struct Foo
{
bool condition;
};
void AppendToVec(vector<Foo>& v)
{
...
v.push_back(...);
}
vector<Foo> vec;
...
for (vector<Foo>::size_type i = 0; i < vec.size(); ++i)
{
if (vec[i].condition) AppendToVec(vec);
}
Это прекрасно работает, и на самом деле элегантно обрабатывает случай, когда вновь добавленные элементы рекурсивно требуют добавления еще большего количества элементов, но он чувствует себя немного хрупким. Если кто-то еще подходит и настраивает петлю, ее можно легко сломать. Например:
//No longer iterates over newly appended elements
vector<Foo>::size_type size = vec.size();
for (vector<Foo>::size_type i = 0; i < size; ++i)
{
if (vec[i].condition) AppendToVec(vec);
}
или
//Vector resize may invalidate iterators
for (vector<Foo>::iterator i = vec.begin(); i != vec.end(); ++i)
{
if (vec->condition) AppendToVec(vec);
}
Есть ли какие-либо рекомендации по работе с такими случаями? Комментирует цикл с помощью "Предупреждение: этот цикл намеренно присоединяется к вектору во время итерации. Измените осторожно" лучший подход? Я открыт для переключения контейнеров, если это делает вещи более надежными.