【问题标题】:std::move() with different data types具有不同数据类型的 std::move()
【发布时间】:2019-04-23 05:59:35
【问题描述】:

我有boost::array<int,8> array1 和我有std::vector<int> temp(8); 我如何从boost::array 执行std::move()std::vector,我想避免memcpy()

【问题讨论】:

  • std::move()boost::arraystd::vector”是什么意思?您是否只想从boost::array 创建一个std::vector
  • 我不知道boost::array,但如果它是std::array 之类的东西,它就没有移动语义。如果你移动,它会移动O(N)中的元素,但不能像std::vector一样移动O(1)中的存储。
  • 在此处的有效 cmets 和答案中,您仍应避免使用 memcpy。使用std::copy()

标签: c++ boost stl


【解决方案1】:

您不能只将容器的内脏移动到std::vectorstd::vector 没有提供获取缓冲区所有权的方法。您必须将各个元素复制/移动到std::vector


您可以做的一件事是使用它的迭代器构造函数和std::make_move_iterator 将单个元素移动到向量中。 int 不会给您带来任何好处,但如果该类型的移动速度比复制速度快,那么您就会看到。看起来像

some_container foo;
// populate foo
std::vector<some_type> moved_into{std::make_move_iterator(std::begin(foo)),
                                  std::make_move_iterator(std::end(foo))};

【讨论】:

    【解决方案2】:

    如果移动有意义,你就移动它。

    array 没有动态分配的缓冲区,所以没有什么可以“窃取”的。 int 不是一个可以移动的对象,所以同样,您甚至不能移动数组的单个元素。

    简而言之,移动array&lt;int&gt; 没有任何意义。

    【讨论】:

      【解决方案3】:

      boost::arraystd::vector 是不相关的类型,因为std::vector 对如何从boost::array 构建一无所知。

      另一方面,您可以将 std::move 与迭代器一起使用:

      boost::array<int, 8> a;
      std::vector<int> v;
      v.reserve(a.size());
      
      std::move(a.begin(), a.end(), std::back_inserter(v));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        相关资源
        最近更新 更多