例如,考虑一下:
std::vector<int> vec;
vec.emplace(vec.begin(),1);
在这种情况下,它将在向量的索引0处为int值赋值1,而不复制任何内容。
但是如果我选择在索引0处指定值1,如下所示:
vec[0] = 1;
我知道,在高级语言中我不需要担心这些事情,但我想C ++中这两种方法之间应该存在巨大差异,也许分配更少内存的速度更快(因为安装不会复制)一个值并节省一些内存。)
你能解释一下吗?
答案 0 :(得分:4)
您无法使用operator[]
来生成矢量。您必须使用insert
,emplace
,push_back
或emplace_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]
),则程序的行为是未定义的。这是一件坏事。