gpt4 book ai didi

C++迭代扩展容器

转载 作者:太空宇宙 更新时间:2023-11-03 10:26:26 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com