如何在添加向量时保持迭代器可解除引用?

时间:2010-12-07 19:50:09

标签: c++ vector iterator push-back

假设我有这段代码:

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,我该如何将其取消引用?如果我必须重置它,是否有一种简单的方法可以让它重新回到以前的位置?

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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));

答案 2 :(得分:0)

你必须得到一个带有数字索引的旧式for循环。无论是那个,还是在循环运行之前保留()向量,以保证它不会调整大小。

另外,原始指针? Srsly。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

§23.1/ 11:

  

除非另有说明(否则   明确地或通过定义函数   在其他功能方面),调用   容器成员函数或传递   一个容器作为一个参数   库函数不得无效   迭代器,或更改值,   该容器内的对象。

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

答案 5 :(得分:0)

正如大多数其他答案已经说过的那样,在这种情况下你最好通过索引访问矢量。

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