3

プログラム内の共有オブジェクトへのポインターを含む 2 つのベクトルがあります。

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 は非常に明確に共有されています(この特定のインスタンスではありません!)。

編集:これが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();
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 に答える