c++ - C++ 向量插入和迭代器混淆
问题描述
int main(){
vector<int> veclist;
veclist.push_back(90);
veclist.push_back(80);
veclist.push_back(70);
vector<int>::iterator it;
it=veclist.begin();
veclist.insert(it,20);
cout << *it << endl; // prints 20
it++;
veclist.insert(it,99);
cout << *it <<endl; // line abc : prints 0
}
嗨,我正在使用 C++ 中的向量和迭代器。在上面的代码中,为什么 "line abc" 打印 0。它不应该打印 99 吗?当我使用 for 循环打印所有矢量元素时,也会打印 99 但为什么 line abc 不这样做?我正在取消对迭代器 *it 的引用,并且我希望它能够保存元素 99。
解决方案
插入向量时,所有先前的迭代器都无效。之后的一切veclist.insert(it,20)
都是未定义的行为。
为了更准确地了解幕后发生的事情,第一次打印工作而第二次打印失败的原因是分配的std::vector
容量。大多数实现只分配2^N 个内存块。
因此,初始向量的容量为 4。当您将大小从 3 增加到 4 时,所有先前的迭代器恰好保持有效。但是,当大小从 4 增长到 8 时,内存被复制到一个新区域,因此您正在访问已删除的内存。
为了解决这个问题,您可以简单地使用std::vector::insert
, 作为指向插入元素的有效迭代器的结果:
例如
it = veclist.insert(it,20);
推荐阅读
- java - 当我关闭会话时,Spring Boot 关闭
- java - 如何在单独的行中显示错误消息
- java - 如何在aspectj中将一些参数从之前的方法传递到之后
- apache-spark - 错误:无法找到或加载主类 org.apache.spark.launcher.Main
- javascript - 使用 JS 从字符串中拆分 URL
- javascript - 如何通过开关条件访问数组?
- ios - 使用编码协议解析 JSON nil 值
- linux - 使用 .NET Core 在 Linux 上更改文件所有者
- java - java 'String[] args' 的 main 函数中的参数是否创建了一个对象?
- javascript - Firefox 插件:在弹出窗口中访问存储