请教下 std::vector 删除操作(erase) 内部流程

2023-02-23 10:26:58 +08:00
 MrEatChicken

如果 vector<int>里有 1 ,2 ,3 ,4 ,5 个元素 删除 3 (执行 erase)

请教: 1.后续的 4 ,5 会移动到 3 前面吗? 2.erase 会触发 vector 缩小容量吗?(既然 push 的操作会触发扩容,erase 会不会触发缩小容量?)

758 次点击
所在节点    程序员
4 条回复
tool2d
2023-02-23 10:57:15 +08:00
后续元素肯定会向前移动,vector 内存是保证连续的,只有移动才能保证这点。

自动缩小容量似乎很难,malloc 一大片内存后,直接砍一半,好像没这种 api 。

频繁内存分配和搬运,是很影响性能的,一般来说能不碰,就不碰。
levelworm
2023-02-23 11:30:11 +08:00
千万别在循环里删。。。
vcyuyu
2023-02-23 11:42:49 +08:00
2. 一般不认为 erase 会影响 capacity
changnet
2023-02-23 12:16:25 +08:00
1. 会移动
2. vector 的元素数量会减 1 。但内存不会释放,作为预留空间。如果要释放,C++11 之后可以调用 shrink_to_fit 。同样的 push 如果有可用的预留空间,也不一定会触发内存分配

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/918447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX