C++ STL vector erase函数中,有没有重新分配内存?

2024-11-30 23:53:55
推荐回答(1个)
回答1:

没有重新分配。但是后续的元素被往前移动,因此被删除的元素之后的迭代器会失效。例如,下面的代码在debug模式下将会崩溃,在release模式下正常运行而且可以看到数组的地址并没有改变。

#include 
#include 

int main(){
    std::vector v{ 1, 2, 3, 4, 5, 6, 7 };
    auto p = v.end() - 2;

    std::cout << &v[0] << "\t" << *p << "\t" << &*p << "\n";
    v.erase(v.begin() + 2);
    std::cout << &v[0] << "\t" << *p << "\t" << &*p << "\n";

    return 0;
}


v.swap(vector(v));将v复制到新的向量中(这个向量的容量正好和v的大小一样),然后与v进行交换。因为这是一个局部变量,所以这句话结束时会将从v处获得的内存释放。同时,v在交换之后,容量和大小一致。

建议你看一下源代码,或者单步调试看看具体的执行过程。