Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现std::vector::swap?_C++_Vector_Swap - Fatal编程技术网

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
作为参数,那么它应该是一个非成员函数。这只是交换如何工作的概念的简单演示。我不想添加非成员函数如何访问类的私有成员等的详细信息。好的,这就是我所想的。除了,这是关于“移动构建临时”的什么?