3

我有两个向量,其中包含指向程序中共享对象的指针:

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

1 回答 1

6

您没有调用移动构造函数。关于emplace_back电话的任何内容都表明v1不再需要。你可能需要一个std::move在那里。

你可能想要:

v2.emplace_back(std::move(v1.back()));
v1.pop_back();
于 2013-07-02T22:43:02.440 回答