如果我们可以使用vector[1]=someInt,那么emplace()的用途是什么? 例如,考虑这一点: std::vector<int> vec; vec.emplace(vec.begin(),1); 我知道,在高级语言中,我不需要担心这些事情,但我认为C++中的两种方法之间应该有很大的不同,也许更快的分配更少的内存(因为EnSurvit不复制一个值,节省一些内存)。

如果我们可以使用vector[1]=someInt,那么emplace()的用途是什么? 例如,考虑这一点: std::vector<int> vec; vec.emplace(vec.begin(),1); 我知道,在高级语言中,我不需要担心这些事情,但我认为C++中的两种方法之间应该有很大的不同,也许更快的分配更少的内存(因为EnSurvit不复制一个值,节省一些内存)。,c++,C++,你能解释一下吗?对于std::vector它没有任何明显的区别。在存储复制成本高昂的对象时,这一点很重要 std::vector<my_type> vec; my_type object(1); vec.push_back(object); // 1 vec.emplace_back(1); // 2 std::向量向量向量机; my_类型对象(1); 向量推回(对象);//1. 向量放置在后面(1);//2. 在第1行中,代码将对象复制到向量中。在第2行中,它将对象构建到位

你能解释一下吗?

对于
std::vector
它没有任何明显的区别。在存储复制成本高昂的对象时,这一点很重要

std::vector<my_type> vec;
my_type object(1);
vec.push_back(object); // 1
vec.emplace_back(1);   // 2
std::向量向量向量机;
my_类型对象(1);
向量推回(对象);//1.
向量放置在后面(1);//2.
在第1行中,代码将对象复制到向量中。在第2行中,它将对象构建到位。在这两种情况下,都会构造一个对象。在第1行中,对象也被复制;如果不需要将对象挂起,则第2行的工作量会减少。

对于
std::vector
,它没有任何明显的区别。在存储复制成本高昂的对象时,这一点很重要

std::vector<my_type> vec;
my_type object(1);
vec.push_back(object); // 1
vec.emplace_back(1);   // 2
std::向量向量向量机;
my_类型对象(1);
向量推回(对象);//1.
向量放置在后面(1);//2.

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

不能使用
运算符[]
来增加向量。必须使用
插入
放置
推回
放置
中的一种来添加元素。您还可以使用
调整大小
添加多个


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

您不能使用
操作符[]
来生成向量。必须使用
插入
放置
推回
放置
中的一种来添加元素。您还可以使用
调整大小
添加多个


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

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

它们在概念上做不同的事情,所以比较一个是否比另一个快没有什么意义


注意:如果您访问超出边界的向量(如向量为空时
vec[0]
),则程序的行为未定义。这是一件坏事。

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

它们在概念上做不同的事情,所以比较一个是否比另一个快没有什么意义


注意:如果您访问超出边界的向量(如向量为空时
vec[0]
),则程序的行为未定义。这是一件坏事。

emplace
构造一个对象,空向量上的
vec[0]
只是未定义的行为。这还不足以说明为什么偏袒一个而不是另一个吗?@StoryTeller那么,未定义的行为可能会出什么问题呢?不知道你的程序运行是否正确,是否不正确,或者只是将你的硬盘擦干净,被一些人认为是有问题的。如果我的想法很近的话,我会告诉你去谷歌看看UB是什么。如果你不欣赏我选择的幽默,你可以忽略我。如果你在结尾添加新元素,你应该尝试使用
emplace\u back
。否则,
emplace(vec.begin(),foo)
非常糟糕,因为它会将任何尾随元素下移一位(就像insert一样),所以除非您试图在前面插入对象,否则请避免使用它
emplace
vs(
insert
push_back
)不会对基本类型产生影响。emplace将参数转发到就地构造。不过我同意@StoryTeller的说法,你应该在提问之前先进行RTFM。看起来你已经使用了智能感知,并且直接这么做了。尝试cppreference.com
emplace
构造一个对象,空向量上的
vec[0]
只是未定义的行为。这还不足以说明为什么偏袒一个而不是另一个吗?@StoryTeller那么,未定义的行为可能会出什么问题呢?不知道你的程序运行是否正确,是否不正确,或者只是将你的硬盘擦干净,被一些人认为是有问题的。如果我的想法很近的话,我会告诉你去谷歌看看UB是什么。如果你不欣赏我选择的幽默,你可以忽略我。如果你在结尾添加新元素,你应该尝试使用
emplace\u back
。否则,
emplace(vec.begin(),foo)
非常糟糕,因为它会将任何尾随元素下移一位(就像insert一样),所以除非您试图在前面插入对象,否则请避免使用它
emplace
vs(
insert
push_back
)不会对基本类型产生影响。emplace将参数转发到就地构造。不过我同意@StoryTeller的说法,你应该在提问之前先进行RTFM。看起来你已经使用了智能感知,并且直接这么做了。试试cppreference.com谢谢,这解释了一切。我想“vector.insert()”也是如此?由于对象也被复制,然后被构造。@AbylIkhsanov有一个移动语义,其中obje