迭代时向元素添加元素

Ale*_*lex 3 c++ foreach vector

正如标题所说,我想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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

好吧,我认为for each是标准的C++,但它似乎是一个Visual Studio功能:

对于每一个,在

Visual C++"为每个"可移植性

Rem*_*eau 8

添加或删除项目的行为std::vector使现有迭代器无效.所以,你不能使用任何形式的循环依赖于迭代器,例如for each, in,范围为基础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;
}
Run Code Online (Sandbox Code Playgroud)

  • @bb1950328 这样做会强制在*每次*迭代时对“size()”进行函数调用,而使用变量时,在进入循环之前只有 1 个对“size()”的函数调用。如果“size()”是内联的,那么无论哪种方式都可能并不重要,但如果“size()”没有内联,那么如果向量大小很大,性能可能会受到影响。更重要的是,您的方法不允许循环在到达旧项目末尾时停止,因为知道没有新项目与正在测试的条件匹配。 (4认同)

for*_*818 5

正如 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')); }
}
Run Code Online (Sandbox Code Playgroud)