如何实现std :: vector :: push_back(T&& value)?

时间:2017-04-19 14:03:11

标签: c++ visual-studio c++11 vector move

如何实现此push_back重载?

void push_back( T&& value );

或者可能是一种可能的实施方式?

2 个答案:

答案 0 :(得分:0)

一种可能的实施方式:

template <typename T, typename Allocator>
void
vector<T, Allocator>::push_back(T&& _element) 
{
    if (size() == capacity()) reallocate(capacity() * 2);

    construct(data()[size()], std::move(_element));
    ++size_val;

    update_vector();
}
如果有的话,

construct()会调用T :: T(T&amp;&amp;)。否则它将调用T :: T(const T&amp;)。

请参阅https://en.cppreference.com和搜索构造以获取更多信息

答案 1 :(得分:0)

一个非常简单的实现是:

template <typename T, typename Allocator>
void vector<T, Allocator>::push_back(T&& _element)
{
  emplace_back(std::move(_element));
}

如果值类型T具有移动构造函数(即T::T(T&&)),则以这种方式执行此操作可能比使用其复制构造函数更有效。 std::vector确实要求其值类型是可复制构造的,因此如果没有移动构造函数,这将使用复制构造函数。

这种情况的一个常见情况是,当一个类包含指向大缓冲区或结构的指针时。如果我们需要初始化为我们可以修改的相同数据的副本,并且原始文件必须保持有效,我们必须制作昂贵的深层副本。另一方面,当我们知道源是一个即将丢弃的临时源时,我们可以将其内容与空对象的内容交换。这使我们可以重新使用相同的内存,而无需重新分配或深入复制其内容。