V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MrEatChicken
V2EX  ›  程序员

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

  •  
  •   MrEatChicken · 2023-02-23 10:26:58 +08:00 · 905 次点击
    这是一个创建于 637 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    4 条回复    2023-02-23 12:16:25 +08:00
    tool2d
        1
    tool2d  
       2023-02-23 10:57:15 +08:00   ❤️ 1
    后续元素肯定会向前移动,vector 内存是保证连续的,只有移动才能保证这点。

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

    频繁内存分配和搬运,是很影响性能的,一般来说能不碰,就不碰。
    levelworm
        2
    levelworm  
       2023-02-23 11:30:11 +08:00 via Android   ❤️ 1
    千万别在循环里删。。。
    vcyuyu
        3
    vcyuyu  
       2023-02-23 11:42:49 +08:00   ❤️ 1
    2. 一般不认为 erase 会影响 capacity
    changnet
        4
    changnet  
       2023-02-23 12:16:25 +08:00
    1. 会移动
    2. vector 的元素数量会减 1 。但内存不会释放,作为预留空间。如果要释放,C++11 之后可以调用 shrink_to_fit 。同样的 push 如果有可用的预留空间,也不一定会触发内存分配
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 535ms · UTC 19:49 · PVG 03:49 · LAX 11:49 · JFK 14:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.