如何实现std :: vector :: swap?

时间:2016-02-28 05:40:57

标签: c++ vector swap

我想到,将数组从一个L复制到另一个std::vector的最快方法是交换指针,只要你不再关心你正在交换的向量。所以我去找了std::vector::swap。我假设交换指针是如何实现的,但我没有在引用中看到解释。

2 个答案:

答案 0 :(得分:3)

简化的最小向量实现可能具有以下成员来管理向量中的数据:

template <typename T>
class simple_vector
{
public:
    // ...

    static
    void swap(simple_vector<T>& x, simple_vector<T>& y);

private:
    T* elements;    // a pointer to the block of memory holding the elements in the vector
    size_t count;   // number of 'active' elements
    size_t allocated;   // number of elements allocated (not all of which are necessarily used at the moment)
};

swap()操作只会交换&#39; guts&#39;每个simplified_vector,保留所有动态分配的缓冲区(及其中包含的元素)。只有指向这些动态分配的指针才会移动:

template <typename T>
void simple_vector<T>::swap(simple_vector<T>& x, simple_vector<T>& y)
{
    T* tmp_elements = x.elements;
    size_t tmp_count = x.count;
    size_t tmp_allocated = x.allocated;

    x.elements = y.elements;
    x.count = y.count;
    x.allocated = y.allocated;

    y.elements = tmp_elements;
    y.count = tmp_count;
    y.allocated = tmp_allocated;
}

请注意,实际的std::vector实现可能会使用不完全相同的技术(例如移动构造临时)作为这个简单示例,但我认为它传达了一般概念。

答案 1 :(得分:2)

来自http://en.cppreference.com/w/cpp/container/vector/swap

  

将容器的内容与其他容器的内容进行交换。不会对单个元素调用任何移动,复制或交换操作。

这对我来说似乎很清楚。

更新,以回应OP的评论

我在g ++ 4.8.4中看到以下内容:

      void
      swap(vector& __x)
#if __cplusplus >= 201103L
            noexcept(_Alloc_traits::_S_nothrow_swap())
#endif
      {
        this->_M_impl._M_swap_data(__x._M_impl);
        Alloc_traits::_S_on_swap(_M_get_Tp_allocator(),
                              __x._M_get_Tp_allocator());
      }

而且,这是_Vector_impl::M_swap_data的实现:

void _M_swap_data(_Vector_impl& __x)
{
  std::swap(_M_start, __x._M_start);
  std::swap(_M_finish, __x._M_finish);
  std::swap(_M_end_of_storage, __x._M_end_of_storage);
}