1

假设我有这个代码:

std::vector<Object*> objects;
std::vector<Object*>::iterator iter;
for (iter = objects.begin(); iter != objects.end(); iter++) {
    if (condition)
        objects.push_back(new Object());
}

但是,当 push_back 发生时,iter变得不可引用。如果不重置iter,我如何保持它可取消引用?如果我必须重置它,是否有一种简单的方法可以让 iter 回到以前的位置?

4

6 回答 6

5

我建议您只需按索引访问它。这完全消除了这个问题。

于 2010-12-07T19:52:24.567 回答
1

如果您绝对必须为此使用迭代器:

std::vector<Object*> objects;
std::vector<Object*> newObjects;
std::vector<Object*>::iterator iter;
for (iter = objects.begin(); iter != objects.end(); ++iter)
{
    if (condition)
    {
        newObjects.push_back(new Object());
    }
}

std::copy(newObjects.begin(), newObjects.end(), back_inserter<vector<Object*> >(objects));
于 2010-12-07T20:20:46.243 回答
0

您将不得不使用带有数字索引的老式 for 循环。要么,要么在循环运行之前保留()向量,以保证它不会调整大小。

另外,原始指针?呲牙咧嘴。

于 2010-12-07T19:52:35.153 回答
0

§23.1/11:

除非另有规定(明确地或通过根据其他函数定义函数),调用容器成员函数或将容器作为参数传递给库函数不应使该容器内对象的迭代器无效或更改其值.

但是,没有明确指定 std::vector::push_back 使任何迭代器无效。

于 2010-12-07T20:31:42.053 回答
0

仅当向量必须重新分配更多内存时,迭代器才会失效。

为了防止重新分配内存,请使用 reserve() 预先分配您需要的所有内存(假设您在分配向量时知道此大小)。

更简单的解决方案保留对成员的间接引用(数组中的索引)。

于 2010-12-07T20:02:25.597 回答
0

正如大多数其他答案已经说过的那样,在这种情况下,您可能最好按索引访问向量。

但是,为了完整性:std::list迭代器没有这个“问题”。所以使用list代替vector是一个可能的解决方案。

于 2010-12-07T21:19:40.160 回答