2016-02-28 194 views
0

在我看来,将阵列从一个std::vector复制到另一个阵列的最快方法是交换它们的指针,只要你不关心你正在交换的向量。所以我去找,发现std::vector::swap。我认为交换指针是如何实现的,但我在参考中没有看到解释。std :: vector :: swap如何实现?

+0

如果你可以打开'vector'的头文件,你可以自己查看实现。 –

+1

根据C++知识的先进程度,人们所要求的是,这可能就像是在问他们如何制作香肠时将一个孩子带到屠宰场。 –

回答

2

简化的最小向量实现可能与以下成员类似,用于管理向量中的数据:

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()操作将只是交换了各自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实现可能使用不完全相同的技术(如移动构建一个临时的),因为这简单的例子,但我认为它传达了一般概念。

+0

如果您将'x'和'y'作为参数,那么它应该是非成员函数 –

+0

这仅仅是交换如何工作的概念的简单演示。我不想添加非成员函数如何访问该类的私有成员的详细信息,等等。 –

+0

好吧,这就是我所想的。除此之外,“移动构建临时”是什么? –

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); 
} 
+0

但在'vector'头文件中,'vector :: swap()'是使用'std :: move()'实现的。 – nom

+0

@有人,看我的更新。 –

+0

不知道这段代码是多么的帮助,而没有看到'_M_swap_data'中的内容 –