迭代时向元素添加元素

时间:2016-06-18 18:05:26

标签: c++ vector foreach

正如标题所说,我想在迭代矢量时在某些情况下向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功能:

for each, in

Visual c++ "for each" portability

2 个答案:

答案 0 :(得分:8)

std::vector添加或删除项目的行为使现有迭代器无效。因此,您不能使用任何依赖于迭代器的循环,例如for each, inrange-based forstd::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')); }
}