c++ - 迭代、插入和删除?

标签 c++

梦想输出:

 /* DREAM OUTPUT:
 INT: 1
 TESTINT: 1
 TESTINT: 2
 TESTINT: 23
 TESTINT: 24
 TESTINT: 25
 TESTINT: 3
 TESTINT: 4
 TESTINT: 5
 TESTINT: 6
 INT: 23
 INT: 24
 INT: 25
 INT: 3
 INT: 4
 INT: 5
 INT: 6

问题

 ERROR 1: Not erasing the '2' causes a bizzare effect.
 ERROR 2: Erasing the '2' causes memory corruption.

代码

 #include <cstdlib>
 #include <iostream>
 #include <vector>

 int main(int argc, char* argv[])
 {
    std::vector<int> someInts;

    someInts.push_back(1);
    someInts.push_back(2);
    someInts.push_back(3);
    someInts.push_back(4);
    someInts.push_back(5);
    someInts.push_back(6);

    for(std::vector<int>::iterator currentInt = someInts.begin();
        currentInt != someInts.end(); ++currentInt)
     if(*currentInt == 2)
     {
        std::vector<int> someNewInts;

        someNewInts.push_back(23);
        someNewInts.push_back(24);
        someNewInts.push_back(25);

        someInts.insert(currentInt + 1, someNewInts.begin(), someNewInts.end());
        //someInts.erase(currentInt);

        for(std::vector<int>::iterator testInt = someInts.begin();
            testInt != someInts.end(); ++testInt)
         std::cout << "TESTINT: " << *testInt << '\n';
     }
     else
        std::cout << "INT: " << *currentInt << '\n';

    return 0;
 }

代码很容易解释,但我想知道这里发生了什么。这是一个使用 ints 的拷贝,它反射(reflect)了一个更大的项目中正在发生的事情。这让我很困惑。

最佳答案

将元素插入 vector 会导致与其关联的迭代器无效,因为 vector 可以增长并因此分配其内部存储空间。

关于c++ - 迭代、插入和删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090277/

相关文章:

c++ - 无法将参数 1 从 'const boost::shared_mutex' 转换为 'const boost::shared_lock<Mutex> &'

c++ - 为什么成员函数的重载决议不包括全局函数?

c++ - 最常用的 STL 算法、谓词、迭代器

c++ - Windows CE MessageBox 不显示 unicode 文本和图标透明度

c++ - 如何解决在仅 header 库 (C++) 中定义的结构对其他结构类型的循环依赖?

C++ SDL2 立即获取鼠标坐标

c++ - 为什么不带参数调用 basic_string::substr?

c++ - 获取模板函数类型

c++ - Boost Spirit Rules可以参数化吗

C++ 使用 QuickSort 对数组结构进行排序