V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
MrEatChicken
V2EX  ›  程序员

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

  •  
  •   MrEatChicken · Feb 23, 2023 · 1429 views
    This topic created in 1168 days ago, the information mentioned may be changed or developed.

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

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

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

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

    频繁内存分配和搬运,是很影响性能的,一般来说能不碰,就不碰。
    levelworm
        2
    levelworm  
       Feb 23, 2023 via Android   ❤️ 1
    千万别在循环里删。。。
    vcyuyu
        3
    vcyuyu  
       Feb 23, 2023   ❤️ 1
    2. 一般不认为 erase 会影响 capacity
    changnet
        4
    changnet  
       Feb 23, 2023
    1. 会移动
    2. vector 的元素数量会减 1 。但内存不会释放,作为预留空间。如果要释放,C++11 之后可以调用 shrink_to_fit 。同样的 push 如果有可用的预留空间,也不一定会触发内存分配
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   955 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 20:08 · PVG 04:08 · LAX 13:08 · JFK 16:08
    ♥ Do have faith in what you're doing.