c++ vector容器erase问题

新手上路,请多包涵
#include <iostream>
#include <vector>

using namespace std;

class A {
public:
    int a;

    explicit A(int n = 0) : a(n) { cout << n << " created\n"; }

    ~A() { cout << a << " destroyed\n"; }
};

int main() {
    vector<A> vectorA(5);
    int n = 0;
    for (auto &p: vectorA) {
        p.a = n++;
    }
    vectorA.erase(vectorA.begin(), vectorA.begin() + 2);

    return 0;
}

c++11,输出结果为:

1574434257212.jpg

疑问:

1.为什么 earse 前两个元素,析构的是后两个对象?
2.程序结束的时候,为什么a=3和a=4的对象又被析构了一次,a=0和a=1两个对象没有被析构?

阅读 2.2k
1 个回答

这个和vector的释放策略有关,因为vector内部包装的是数组
初始化: verctorA = [a=0,a=1,a=2,a=3,a=4]
删除区间[0,2): 对于数组来说 最好是从尾部删除元素 这样后面才能快速push 所以这里会发生对象拷贝
拷贝后:verctorA = [a=2,a=3,a=4,a=3,a=4] 删除最后两个
删除后: verctorA = [a=2,a=3,a=4]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题