std::数据结构中的向量移动语义

std::vector move semantics in a data structure

本文关键字:移动 语义 向量 数据结构 std      更新时间:2023-10-16

对于这个简单的循环队列,我想支持C++11的移动语义,这样push((就不会在不需要的情况下产生内存拷贝。

Circular<struct r, 1024> queue_;
queue_.push( { r0, r1 } );  

然而,我担心我的实现,特别是下面的第二个push((,是不必要的或过于冗长。

template<typename T, size_t capacity>
class Circular
{
public:
  Circular()
    : have_(capacity)
    , w_(0)
    , r_(0)
  {}
  ~Circular() {}
  void push( const T& x ) { have_[ w_++ % capacity ] = x; }
  void push( T&& x )    { have_[ w_++ % capacity ] = x; }
...
protected:
  std::vector<T> have_;
  size_t w_;
  size_t r_;
};

有没有更好的方法来获得这些语义?(编辑:预期的语义真的实现了吗?(

后续:我们能在保留预期行为的同时避免重复push((方法的主体吗?

确实有一种更好的方法来获得这些语义:事实上,有一种方法可以让实际在代码当前没有的地方获得这些语义。:-(

接受push中的右值引用是等式的一半,但在该函数中,它又是一个左值表达式,因此需要添加std::move以"传递右值引用"。

void push( T&& x )    { have_[ w_++ % capacity ] = std::move(x); }

除此之外,我想不出有什么特别的改进。