std::vector::p ush_back( T&& value ) 是如何实现的?

How the std::vector::push_back( T&& value ) implemented?

本文关键字:何实现 实现 vector back value std ush      更新时间:2023-10-16

此push_back Overload如何实现?

void push_back( T&& value );

或一个可能的实现?

一种可能的实现:

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(t&amp;&amp;(。否则,它将称为t :: T(const t&amp;(。

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

一个非常简单的实现将是:

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

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

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