我有两个向量,其中包含指向程序中共享对象的指针:
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();
我在这里做错了什么?这不是正确的方式吗?使用不同指针类型的BTW不是一个选项 - 类型T是非常明确地共享的(仅在这个特定的实例中!)。
编辑:以下是我对David的解决方案的实施:
// 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();
答案 0 :(得分:6)
您没有调用移动构造函数。 emplace_back
来电没有任何内容表明不再需要v1
。你可能需要std::move
。
你可能想要:
v2.emplace_back(std::move(v1.back()));
v1.pop_back();