使用迭代器向std::vector插入元素无效果,请问问题出在哪?
问题分析与解决
你的代码核心问题是迭代器失效,具体原因如下:
- 初始时
vect1是空vector,你获取了它的起始迭代器i1 = vect1.begin()。 - 调用
vect1.push_back("Test")时,由于vector初始容量为0,会触发内存重新分配——vector会申请新的内存空间存储元素,原来的内存会被释放。这时候之前保存的迭代器i1已经指向了被释放的无效内存,完全失效。 - 后续使用
*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
相关产品推荐
相关产品推荐

