运行以下测试代码
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 }
(只销毁一次)?
答案 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();
}
非常感谢对此代码的评论。