22

std::moveC++11 では、値をコンテナーに移動 (破壊的にコピー) したいときに を使用することで、効率を高めることができます。

SomeExpensiveType x = /* ... */;
vec.push_back(std::move(x));

しかし、私はそれ以外の方法を見つけることができません。つまり、次のようなものです。

SomeExpensiveType x = vec.back(); // copy!
vec.pop_back(); // argh

これは、アダプタのようなものでより頻繁に (コピーポップ) 発生しstackます。このようなものが存在する可能性があります:

SomeExpensiveType x = vec.move_back(); // move and pop

コピーを避けるには?そして、これはすでに存在しますか?n3000ではそのようなものは見つかりませんでした。

私は痛ましいほど明白な何か (その不必要性など) を見逃していると感じているので、「ru dum」の準備ができています。:3

4

4 に答える 4

20

私はここで完全に間違っているかもしれませんが、あなたが望むものではありません

SomeExpensiveType x = std::move( vec.back() ); vec.pop_back();

SomeExpensiveType に移動コンストラクターがあると仮定します。(そして明らかにあなたの場合に当てはまります)

于 2010-01-26T22:04:53.220 に答える
4

完全を期すために (および C++1x コンパイラーなしでこの質問に出くわした人は誰でも)、現在既に存在する代替手段:

SomeExpensiveType x;
std::swap(x, vec.back()); 
vec.pop_back();

std::swap要素タイプに対して存在するためには、特殊化が必要なだけです。

于 2010-04-08T06:55:12.343 に答える
4
template<class C>
auto pop_back(C& c) -> typename std::decay<decltype(c.back())>::type
{
  auto value (std::move(c.back()));
  c.pop_back();
  return value;  // also uses move semantics, implicitly
  // RVO still applies to reduce the two moves to one
}
于 2010-10-01T10:57:14.233 に答える
-1

一般に、高価な型の場合は、代わりにラッパー クラスまたはスマート ポインターをコンテナーにプッシュする必要があると思います。このようにして、高価なコピーを回避し、代わりにスマート ポインターまたはラッパー クラスの安価なコピーのみを実行します。ハハが必要な場合は、生のポインターも使用できます。

class ExpensiveWrapper
{
public:
   ExpensiveWrapper(ExpensiveClass* in) { mPtr = in; }

   // copy constructors here....

private:
   ExpensiveWrapper* mPtr;

};
于 2010-01-26T22:10:51.280 に答える