C++迭代扩展容器

标签 c++ iteration containers

如果我在遍历容器时扩展容器会发生什么,我会遇到新元素还是旧元素

std::vector<int> arr(0);
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);

for (auto& ele : arr) {
    if (4 == ele) std::cout << "meet new eles" << endl;
    arr.push_back(4);
}

最佳答案

push_back 可能会使 vector 的任何迭代器无效,你所拥有的是未定义的行为。

std::vector 在内部分配一个数组,其元素连续存储在内存中。为此,它需要预分配它可能需要的大小的估计值,这称为 vector 的容量。在 push_back 处,如果达到容量,它会分配一个更大的新数组,将前一个数组的所有内容复制/移动到新数组,然后删除旧数组。这会使迭代器无效,它一直指向已删除的数组。

另外值得一提的是,新数组的分配增加了相当大的性能损失。如果你知道你的 vector 将始终使用的大小 reserve()预分配内存。

现在,真正的情况是,如果您事先预留容量并且从不推回超过该容量,则迭代器将不会失效(仅尾端迭代器)并且您可以继续递增它们,因为它们指向一个连续的数组元素。但我不建议这样做,IMO 错误地重新分配 vector 的风险是不值得的。

关于C++迭代扩展容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32776571/

相关文章:

Golang 界面 slice

python - 从 Python 中的列表列表打印到文件

c++ - 个别实例有效,但数组显示内存损坏

c++ - Qt 翻译 lupdate 和命名空间

JavaScript eval() JSON 问题

Docker 端口转发不正确?

css - 切换 div 容器与其下方的另一个容器重叠

c++ - 使用 clocks_per_sec 计算过剩帧率太慢

C++ 函数不在主要部分执行

c++ - 对象容器的性能与指针容器的性能