在我看来,将阵列从一个std::vector
复制到另一个阵列的最快方法是交换它们的指针,只要你不关心你正在交换的向量。所以我去找,发现std::vector::swap
。我认为交换指针是如何实现的,但我在参考中没有看到解释。std :: vector :: swap如何实现?
回答
简化的最小向量实现可能与以下成员类似,用于管理向量中的数据:
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
实现可能使用不完全相同的技术(如移动构建一个临时的),因为这简单的例子,但我认为它传达了一般概念。
如果您将'x'和'y'作为参数,那么它应该是非成员函数 –
这仅仅是交换如何工作的概念的简单演示。我不想添加非成员函数如何访问该类的私有成员的详细信息,等等。 –
好吧,这就是我所想的。除此之外,“移动构建临时”是什么? –
从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);
}
但在'vector'头文件中,'vector :: swap()'是使用'std :: move()'实现的。 – nom
@有人,看我的更新。 –
不知道这段代码是多么的帮助,而没有看到'_M_swap_data'中的内容 –
- 1. 如何实现std :: vector insert? C++
- 2. 如何用std :: vector实现堆栈?
- 3. std :: forward_list在C++中的swap()实现11
- 4. `std :: mem :: swap`如何工作?
- 5. std :: vector的概念和GCC实现
- 6. 正确的方式来实现std :: vector的std :: vector的类的移动语义
- 7. 如何实现类似于std :: vector的自定义类
- 8. std :: vector :: push_back(T &&值)是如何实现的?
- 9. 在向量或向量之间使用std :: swap :: swap?
- 10. std :: vector <std :: vector <T>> vs std :: vector <T*>
- 11. iterate std :: vector <std :: vector <char>>?
- 12. 如何缩小std :: vector?
- 13. 如何从std :: vector <>
- 14. C++ std :: vector如何工作?
- 15. 如何缩短std :: vector?
- 16. 如何导出std :: vector
- 17. std :: vector vs std :: insert
- 18. 展开std :: vector <std :: vector <T>>转换为std :: vector <T>
- 19. posix_memalign for std :: vector
- 20. boost :: interprocess - std :: string与std :: vector
- 21. 使用std :: vector的
- 22. std :: unique_locks的std :: vector向量
- 23. std :: bad_alloc错误与std :: vector
- 24. 是std :: unique_ptr移入std :: vector
- 25. 继承std :: vector
- 26. 如何实现std :: has_virtual_destructor?
- 27. std :: experimental :: source_location如何实现?
- 28. std :: swap专用于Eigen
- 29. 化std :: swap返回0xBAADF00D
- 30. 化std :: swap用的std ::向量在结构C++
如果你可以打开'vector'的头文件,你可以自己查看实现。 –
根据C++知识的先进程度,人们所要求的是,这可能就像是在问他们如何制作香肠时将一个孩子带到屠宰场。 –