运行下面的测试代码
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/