【问题标题】:How the std::vector::push_back( T&& value ) implemented?std::vector::push_back( T&& value ) 是如何实现的?
【发布时间】:2017-09-15 19:37:29
【问题描述】:

这个 push_back 重载是如何实现的?

void push_back( T&& value );

或者也许是一种可能的实现方式?

【问题讨论】:

  • 只看你电脑上的库头,我看不出在这里粘贴一些实现有什么好处。
  • 一种方式:data[last_element + 1] = std::move(value);
  • @JerryCoffin:不——value 本身就是一个左值。您需要 std::move 使 value 成为右值引用。
  • @JerryCoffin 右值引用不是右值。
  • @JerryCoffin 不,它被转换为右值;而value 是一个左值,作为一个命名变量。

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


【解决方案1】:

一种可能的实现方式:

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::T(const T&)。

查看https://en.cppreference.com 并搜索构造以了解更多信息

【讨论】:

    【解决方案2】:

    一个非常简单的实现是:

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

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

    当一个类包含一个指向大缓冲区或结构的指针时,这会产生影响。如果我们需要一个初始化为我们可以修改的相同数据的副本,并且原始副本必须保持有效,我们必须制作一个昂贵的深度副本。另一方面,当我们知道源是即将被丢弃的临时源时,我们可以将其内容与空对象的内容交换。这让我们可以重复使用相同的内存,而不需要对其内容进行重新分配或深拷贝。

    【讨论】:

      猜你喜欢
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多