繁体   English   中英

插入只移动类型的向量

[英]Inserting into a vector of move-only type

我有一个std::vector<std::unique_ptr<T>> 我想在这个向量的中间insert一些nullptr 我尝试vec.insert(first, size, nullptr)但这显然不起作用,因为需要复制nullptr 我可以反复调用单数版本的insert ,但我想知道是否有更有效的方法。

“高效”是需要衡量的。 但是如果你想要一次性移动元素而不是不断地向右移动一个项目,你可以用std::rotate来做。 这是如何做

vec.resize(vec.size() + size); // Add the "null" pointers to the end.
// Obtain valid first after resize
std::rotate(first, vec.end() - size, vec.end());

由于rotate的功能是使中间迭代器成为范围的“新的第一个”,而前面的迭代器是“new last”,上面选择的迭代器会将空指针的范围移到它们的预期位置(之前)第一)。

此外,由于您标记了C ++ 17,您还可以将标准算法传递给执行策略,并希望获得一些并行性来启动。

您可以将自己的迭代器放在一起,在取消引用时创建默认实例。 这些是prvalues,它允许在向量中构造仅移动类型。 使用这种迭代器的计数实例来调用std::vector::insert 这是一个可能不符合标准的例子,但有效。

template <class T>
class DefaultCtorInputIt {
   public:
      DefaultCtorInputIt(size_t n) : n(n) {}

      using value_type = T;
      using reference = T;
      using pointer = T;
      using iterator_category = std::input_iterator_tag ;
      using difference_type = int;
      using Self = DefaultCtorInputIt; // save typing (below)

      value_type operator *() { return T(); }
      Self& operator ++() { ++n; return *this; }

      friend bool operator == (const Self& lhs, const Self& rhs) {
         return lhs.n == rhs.n;
      }

      friend bool operator != (const Self& lhs, const Self& rhs) {
         return !(lhs == rhs);
      }

   private:
      size_t n;
};

这样,你就可以

std::vector<std::unique_ptr<int>> v;

 // Fill v with some values...

using NullUPtr =DefaultCtorInputIt<std::unique_ptr<int>>; // save typing

// Insert 10 default constructed instances at desired position:
v.insert(v.begin() + 42, NullUPtr(0), NullUPtr(10));

请注意,为了尽可能高效,您应该确保上面的迭代器有资格作为随机访问迭代器,这样可以用O计算范围[NullUPtr(0), NullUPtr(10))大小( 1)预先只分配一次内存。 手工制作自己的迭代器类型时,还值得看看Boost迭代器外观

调整向量大小并使用std::move_backward.

例如

vec.resize(vec.size() + num_new)
std::move_backward(vec.begin() + num_unmoved,
                   vec.end() - num_new,
                   vec.end());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM