如何实现此push_back重载?
void push_back( T&& value );
或者可能是一种可能的实施方式?
答案 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
确实要求其值类型是可复制构造的,因此如果没有移动构造函数,这将使用复制构造函数。
这种情况的一个常见情况是,当一个类包含指向大缓冲区或结构的指针时。如果我们需要初始化为我们可以修改的相同数据的副本,并且原始文件必须保持有效,我们必须制作昂贵的深层副本。另一方面,当我们知道源是一个即将丢弃的临时源时,我们可以将其内容与空对象的内容交换。这使我们可以重新使用相同的内存,而无需重新分配或深入复制其内容。