如果我们可以使用vector [1] = someInt,那么emplace()的目的是什么?

时间:2017-10-27 12:22:07

标签: c++

例如,考虑一下:

std::vector<int> vec;
vec.emplace(vec.begin(),1);

在这种情况下,它将在向量的索引0处为int值赋值1,而不复制任何内容。

但是如果我选择在索引0处指定值1,如下所示:

vec[0] = 1;

我知道,在高级语言中我不需要担心这些事情,但我想C ++中这两种方法之间应该存在巨大差异,也许分配更少内存的速度更快(因为安装不会复制)一个值并节省一些内存。)

你能解释一下吗?

3 个答案:

答案 0 :(得分:4)

您无法使用operator[]来生成矢量。您必须使用insertemplacepush_backemplace_back中的一个添加元素。您也可以使用resize添加多个。

索引越界是未定义的行为。这可能会导致您的程序在一个更好的情况下崩溃,或导致您的应用程序被恶意输入劫持。

答案 1 :(得分:1)

对于std::vector<int>,它没有任何明显的区别。当您存储复制昂贵的对象时,这很重要。

std::vector<my_type> vec;
my_type object(1);
vec.push_back(object); // 1
vec.emplace_back(1);   // 2

在第1行中,代码对象复制到向量中。在第2行中,它构造对象。在这两种情况下,都会构造一个对象。在第1行中,对象被复制;如果您不需要让对象闲置,第2行的工作就会减少。

答案 2 :(得分:1)

不同之处在于emplace(以及push_back)将新元素添加到向量中,而下标运算符则允许访问向量中必须已存在的元素。

他们在概念上做了不同的事情,因此比较一个人是否比另一个更快是没有意义的。

P.S。如果访问向量越界(例如,当向量为空时为vec[0]),则程序的行为是未定义的。这是一件坏事。

相关问题