У меня есть вектор, который я перебираю.Во время итерации я могу добавлять новые значения в вектор.Это выглядит примерно так:
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);
}
Существуют ли передовые практики для рассмотрения подобных случаев?Является ли комментирование цикла «Предупреждение: этот цикл преднамеренно добавляется к вектору во время итерации. Измените осторожно» лучшим подходом?Я также открыт для переключения контейнеров, если это делает вещи более надежными.