C++ 如何实现std::vector::swap?
我突然想到,将数组从一个C++ 如何实现std::vector::swap?,c++,vector,swap,C++,Vector,Swap,我突然想到,将数组从一个std::vector复制到另一个std::vector>的最快方法是交换它们的指针,只要你不再关心从中交换的向量。所以我去寻找并找到了std::vector::swap。我假设交换指针是如何实现的,但我在参考资料中没有看到解释 来自: 将容器的内容物与其他容器的内容物交换。不会对单个元素调用任何移动、复制或交换操作 这对我来说似乎很清楚 更新,回应OP的评论 我在g++4.8.4中看到了以下内容: void swap(vector& __
std::vector
复制到另一个std::vector>的最快方法是交换它们的指针,只要你不再关心从中交换的向量。所以我去寻找并找到了std::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());
}
下面是\u Vector\u impl::M\u swap\u 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);
}
发件人:
将容器的内容物与其他容器的内容物交换。不会对单个元素调用任何移动、复制或交换操作
这对我来说似乎很清楚
更新,回应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());
}
下面是\u Vector\u impl::M\u swap\u 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);
}
简化的最小向量实现可能有以下成员来管理向量中的数据:
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)
};
请注意,实际的std::vector
实现可能使用与此简单示例不完全相同的技术(例如移动构造临时对象),但我认为它传达了一般概念。一个简化的,最小向量实现可能有以下成员来管理向量中的数据:
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)
};
请注意,实际的std::vector
实现可能会使用与此简单示例不完全相同的技术(例如移动构造临时对象),但我认为它传达了一般概念。如果可以打开vector
的标题,你可以自己看一下实现。取决于C++中的知识是多么高级,问的人是,当他们问香肠是如何制作的时候,比如带一个孩子去屠宰场。如果你可以打开代码头,就可以找到<代码>矢量<代码>。你可以自己查看实现。取决于C++知识的高级程度,这是一个询问屠房如何制作香肠的孩子。但是在<>代码> vector < /COD>头文件中,<代码> vector:vector:(<)(代码)>使用<代码> STD::MOVER()
。如果不同时查看\u M\u swap\u数据中的内容,则不确定此代码段是否有很大帮助,这是一个很好的建议。但是在vector
头文件中,vector::swap()
是使用std::move()
实现的。如果不同时查看\u M\u swap\u数据中的内容,则不确定此代码段是否有很大帮助,很好的建议。如果您将x
和y
作为参数,那么它应该是一个非成员函数。这只是交换如何工作的概念的简单演示。我不想添加非成员函数如何访问类的私有成员等的详细信息。好的,这就是我所想的。除此之外,“移动构造临时”是什么?如果将x
和y
作为参数,那么它应该是一个非成员函数。这只是交换如何工作的概念的简单演示。我不想添加非成员函数如何访问类的私有成员等的详细信息。好的,这就是我所想的。除了,这是关于“移动构建临时”的什么?