假设我有这段代码:
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
,我该如何将其取消引用?如果我必须重置它,是否有一种简单的方法可以让它重新回到以前的位置?
答案 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
是一种可能的解决方案。