gpt4 book ai didi

c++ - 在迭代 vector 时附加到 vector ?

转载 作者:IT老高 更新时间:2023-10-28 23:27:53 25 4
gpt4 key购买 nike

我有一个要迭代的 vector 。在迭代时,我可能会将新值附加到 vector 中。它看起来像:

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);
}

是否有处理此类案例的最佳做法?用“警告:此循环在迭代时有意附加到 vector 。谨慎更改”来评论循环是最好的方法吗?如果这能让事情变得更健壮,我也愿意切换容器。

最佳答案

我解决这个问题的方法通常是创建一个队列,向其中添加任何新元素,然后在遍历原始容器后,处理队列中的元素和/或将它们附加到原始容器中。

这种方法的优点是发生的事情是显而易见的,并且它适用于多个线程可能将新元素排队的情况。

关于c++ - 在迭代 vector 时附加到 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3443434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com