新的C++11模板方法是否会使以前的C++98/03 push_back/insert方法过时
Do the new C++11 emplace methods make the previous C++98/03 push_back/insert methods obsolete?
在C++11中使用vector::push_back()
而不是vector::emplace_back()
,类似地使用map::insert()
而不是map::emplace()
是否仍然有意义?
我的理解是,新的现代C++11模板方法用给定的参数(完全转发给构造函数)在适当的位置构造对象,因此它们保存复制和移动操作,因此它们应该比旧的C++98/03方法更高效。
我是不是错过了什么?
劝阻使用旧式方法安全吗?
从push_back()和template_back(。
void push_back( const T& value );
void push_back( T&& value );
与
template< class... Args >
void emplace_back( Args&&... args );
代码样本
vector<int> v;
v.push_back(1); // "Constructs" an int object in place, then passes it by reference or refref
v.emplace_back(1); // Calls int constructor with argument 1 directly in place in vector
vector<SpaceShip> u;
u.push_back(SpaceShip(new Engine(), new Hull())); // Make a temporary, then COPY or MOVE
u.emplace_back(new Engine(), new Hull()); // Construct in place
正如您所说,emplace_back
旨在构造对象。那么,如果你已经有了一个对象,并且你想在容器中复制或移动它,该怎么办呢?为什么要调用emplace_back
来创建一个新的实例,即使您可以将现有对象移动到这个新实例中?
对于不同的目的,这两种选择都是有用的。emplace_back
可能能够以相同的性能与push_back
做完全相同的事情,但在代码中显示您的意图仍然更清晰。
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法