迭代时将元素添加到 Vector

新手上路,请多包涵

正如标题所说,在某些情况下,我想在迭代向量时向 std::vector 添加一个元素。使用以下代码,我收到错误“调试断言失败”。是否有可能实现我想做的事情?

这是我测试过的代码:

 #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 的一个功能:

对于每个,在

Visual c++“为每个”可移植性

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 410
2 个回答

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

原文由 Remy Lebeau 发布,翻译遵循 CC BY-SA 3.0 许可协议

正如 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')); }
}

原文由 463035818_is_not_a_number 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题