我有两个向量,其中包含指向程序中共享对象的指针:
typedef shared_ptr<T> sp;
std::vector<sp> v1;
std::vector<sp> v2;
有时我想将一个sp类型的对象从 v1 的末尾移动到 v2 的末尾。这部分代码是我程序中的一个重要瓶颈,因为在移动后我不需要 v1 中的值,我想如果我移动它们而不是复制我可以避免额外的计数器递增/递减,对吗?所以这就是我所做的:
// move constructor for new element of v2:
v2.emplace_back(v1.back());
// the move constructor should have made the element in v1 null:
assert(v1.back() == nullptr); // FAIL - why?
// now remove the dead element at the end of v1
v1.pop_back();
我在这里做错了什么?这不是正确的方法吗?顺便说一句,使用不同的指针类型不是一个选项 - 类型 T 是非常明确共享的(只是在这个特定实例中没有!)。
编辑:这是我对大卫解决方案的实现:
// move constructor for new element of v2:
v2.emplace_back(std::move(v1.back()));
// the move constructor should have made the element in v1 null:
assert(v1.back() == nullptr); // ok!
// now remove the dead element at the end of v1
v1.pop_back();