正如标题所说,我想在迭代矢量时在某些情况下向std::vector
添加一个元素。使用以下代码,我收到错误“Debug assertion failed”。是否有可能实现我想做的事情?
这是我测试过的代码:
#include <vector>
class MyClass
{
public:
MyClass(char t_name)
{
name = t_name;
}
~MyClass()
{
}
char name;
};
int main()
{
std::vector<MyClass> myVector;
myVector.push_back(MyClass('1'));
myVector.push_back(MyClass('2'));
myVector.push_back(MyClass('3'));
for each (MyClass t_class in myVector)
{
if (t_class.name == '2')
myVector.push_back(MyClass('4'));
}
return 0;
}
编辑:
好吧,我认为for each
是标准的C ++,但它似乎是Visual Studio功能:
答案 0 :(得分:8)
从std::vector
添加或删除项目的行为使现有迭代器无效。因此,您不能使用任何依赖于迭代器的循环,例如for each, in
,range-based for
,std::for_each()
等。您将不得不使用索引循环,例如:
int main()
{
std::vector<MyClass> myVector;
myVector.push_back('1');
myVector.push_back('2');
myVector.push_back('3');
std::vector<MyClass>::size_type size = myVector.size();
for (std::vector<MyClass>::size_type i = 0; i < size; ++i)
{
if (myVector[i].name == '2')
{
myVector.push_back('4');
++size; // <-- remove this if you want to stop when you reach the new items
}
}
return 0;
}
答案 1 :(得分:1)
正如pyon所指出的,在迭代它(通过迭代器)时将元素插入到向量中不起作用,因为迭代器通过插入元素而失效。但是,您似乎只想在向量的后面推送元素。这可以在不使用迭代器的情况下完成,但是你应该小心停止条件:
std::vector<MyClass> myVector;
size_t old_size = myVector.size();
for (int i=0;i<old_size;i++) {
if (myVector[i].name == '2') { myVector.push_back(MyClass('4')); }
}