从向量中删除元素时析构函数被调用两次

时间:2014-04-14 03:43:56

标签: c++

运行以下测试代码

int destroyed[3] = { 0, 0, 0 };

struct Test {
    int a;
    Test() {}
    ~Test() {
        destroyed[a]++;
    }
};

template<class T>
void remove(std::vector<T>& v, size_t i) {
    std::swap(v[i], v.back());
    v.pop_back();
}

main() {
    std::vector<Test> vt(3);
    vt[0].a = 0;
    vt[1].a = 1;
    vt[2].a = 2;
    remove(vt, 0);
}

destroyed计算元素被销毁的次数。

我可以看到destroyed = { 2, 0, 0 }

我想删除元素0,所以我应该销毁它。但是,我不需要两次调用它的析构函数;那么,我如何编写remove函数,以便最终得到destroyed = { 1, 0, 0 }(只销毁一次)?

1 个答案:

答案 0 :(得分:0)

remove的这种实现似乎有效

template<class T>
void remove(std::vector<T>& v, size_t i) {
    uint8_t d[sizeof T];
    memcpy(d, &v[i], sizeof T);
    v[i] = v.back();
    memcpy(&v.back(), d, sizeof T);
    v.pop_back();
}

非常感谢对此代码的评论。