22

std::move在 C++11 中,当我们想要将值移动(破坏性复制)到容器中时,我们可以通过使用来提高效率:

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

但我找不到任何相反的方向。我的意思是这样的:

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

这在适配器的 like 上更频繁(复制弹出)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 回答