向量移动语义c++11



我已经搜索了一段时间,但我找不到明确的解释来解释我的疑虑。主要:

struct foo
{
    foo(int n=0) : m_n(n) {}
    int m_n;
};
  std::vector<foo> vec;
  vec.push_back(100);
  vec.push_back(55);
  vec.push_back(6);
  std::cout << vec.data() << std::endl; //0x1aca010
  std::cout << vec.capacity() << std::endl; //4
  vec.push_back(6);
  vec.push_back(6);
  std::cout << vec.data() << std::endl; //0x1aca050  *
  std::cout << vec.capacity(); //8

*据我所知,向量是一个动态数组,它包含一个连续内存块中的数据。当我们调整它的大小,并且没有足够的空间容纳更多的元素时,就会分配新的内存块,所有元素都会复制到那个内存块。对于c++11中的移动语义,它的工作原理是一样的吗?它不是一个列表,所以指针不能只是"交换"。

为什么你认为指针不能直接"交换"?让我向您展示一个可能的实现>o<

template <typename T>
class vector
{
private:
    T *mem;
    // ...
public:
    // ...
    vector(vector &&rhs)
        : vector() // delegate constructor
    {
        rhs.swap(*this);
    }
    vector &operator =(vector &&rhs)
    {
        rhs.swap(*this);
        rhs.clear();
        rhs.shrink_to_fit();
        return *this;
    }
    void swap(vector &obj)
    {
        using std::swap;
        swap(mem, obj.mem);
        // ...
    }
    // ...
};

但是,如果您想使用与原始向量不同的分配器(即使用此页面的第六个构造函数),则应该分配新内存并将数据复制到其中,而不仅仅是交换指针。

最新更新