Emplace_back而不是在 stl 容器上push_back
Emplace_back instead of push_back on stl containers?
我不太确定我是否总是可以用emplace_back
替换push_back
。
我知道emplace_back
可以转发参数以直接在向量中构造对象,而无需复制两次(完美转发等......
如果我这样做:
vector<A> o;
o.emplace_back(A{});
那么它应该调用 A. 的复制构造函数。所以它的作用与push_back
完全相同。不是吗?
有一些例外吗?有充分的理由使用push_back吗?因为这样更容易总是emplace_back使用而不考虑它。
emplace
的主要目的是执行显式转换:
#include <chrono>
#include <vector>
using namespace std::chrono_literals;
std::vector<std::chrono::seconds> time;
time.push_back(1s); // OK
// time.push_back(1); // Error, thank god
time.emplace_back(1); // OK, we assume you know what you're doing
使用 push_back
将给定值的元素添加到容器中。使用 emplace_back
从构造函数参数显式构造元素。
"emplace_back"的另一个应用程序(除了 Kerrek SB 的答案)是在容器中构造一个不可复制/不可移动的对象:
#include <list>
class Resource
{
private:
int id;
int data;
public:
Resource(int id, int data) : id(id), data(data) {}
Resource(const Resource&) = delete;
Resource& operator = (const Resource&) = delete;
};
int main() {
std::list<Resource> resources;
// The following will not compile:
// resources.push_back(Resource(1, 2));
resources.emplace_back(1, 2);
}
相关文章:
- 推导 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()方法