You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用迭代器向std::vector插入元素无效果,请问问题出在哪?

问题分析与解决

你的代码核心问题是迭代器失效,具体原因如下:

  1. 初始时vect1是空vector,你获取了它的起始迭代器i1 = vect1.begin()。
  2. 调用vect1.push_back("Test")时,由于vector初始容量为0,会触发内存重新分配——vector会申请新的内存空间存储元素,原来的内存会被释放。这时候之前保存的迭代器i1已经指向了被释放的无效内存,完全失效。
  3. 后续使用*i1和vect1.insert(i1, "Apple")都是未定义行为,程序可能崩溃、输出乱码,或者出现你看到的“内容未改变”这种异常表现。

修正方案

你需要确保使用的迭代器始终有效,要么在修改vector后重新获取迭代器,要么直接在需要时调用begin()获取当前有效的迭代器。

修正后的代码示例:

#include <iostream>
#include <vector>
#include <iterator>

void display(const std::vector<std::string> &v){
    for(int i = 0; i < v.size(); i++){
        std::cout << v[i] << " ";
    }
    std::cout << std::endl;
}

int main(){
    std::vector<std::string> vect1;

    vect1.push_back("Test");
    display(vect1);
    // 在push_back后重新获取有效迭代器
    std::vector<std::string>::iterator i1 = vect1.begin();
    std::cout << *i1 << std::endl;
    vect1.insert(i1, "Apple");
    std::cout << vect1.size() << std::endl;
    display(vect1);

    return 0;
}

更简洁的写法:

如果不需要提前使用迭代器,也可以直接在insert时调用vect1.begin(),省去保存迭代器的步骤:

vect1.insert(vect1.begin(), "Apple");

修改后程序会输出预期结果:

Test 
Test
2
Apple Test 

内容的提问来源于stack exchange,提问作者Tejas Adhude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:01:19