std::vector::p ush_back( T&& value ) 是如何实现的?
How the std::vector::push_back( T&& value ) implemented?
此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
确实要求其值类型是可复制构造的,因此如果没有移动构造函数,这将使用复制构造函数。
这是一种有所不同的常见情况是,当类包含指向大型缓冲区或结构的指针时。如果我们需要将副本初始化为可以修改的相同数据,并且原件必须保持有效,则必须制作昂贵的深副本。另一方面,当我们知道源是即将扔掉的临时性时,我们可以将其内容与空对象的内容交换。这使我们可以重复使用相同的内存,而无需其内容的深层副本。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 如何自己为我自己的shared_ptr实现实现别名构造函数
- 这个UTF-8实现实现是定义的还是定义良好的
- 我的 PRNG 实现与我尝试复制的实现有何不同?