c++ - 从 vector 中删除元素时析构函数调用两次

标签 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 }(只销毁它一次)?

最佳答案

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();
}

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

关于c++ - 从 vector 中删除元素时析构函数调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23051600/

相关文章:

c++ - SDL 2.0 我可以不在主线程中运行它吗?

c++ - 测试 QQuickView (QWindow) 在 Qt 5.0.x 中是否全屏

c++ - 列表控件在删除键按下时删除行

c++ - 初始化类内的静态常量数组 - C++

C++ 从调用指定函数/方法的位置进行检查

c++ - 我将如何编译 Kiss_fft 以使用双数据类型 C++?

c++ - 使用可变参数宏生成数组

c++ - 如何正确地将带参数的函数传递给另一个函数?

c++ - 如何将 Microsoft C++ 解决方案导入 Eclipse?

c++ - 用两点映射一维数组