C++ 标准::向量::安放与放置新
当我想在向量中构造一个对象时,我可以编写以下代码:C++ 标准::向量::安放与放置新,c++,c++11,C++,C++11,当我想在向量中构造一个对象时,我可以编写以下代码: class NonTrivialType { NonTrivialType() = default; NonTrivialType(InitParam param){/* implementation */}; }; // array with 100 default-constructed objects in it std::vector<NonTrivialType> data(100); int main
class NonTrivialType {
NonTrivialType() = default;
NonTrivialType(InitParam param){/* implementation */};
};
// array with 100 default-constructed objects in it
std::vector<NonTrivialType> data(100);
int main(){
// prepare some init parameters
InitParam param{/* some data */};
// construct an object at 50th position
data.emplace(data.begin()+49, param);
}
我的问题是,为什么我要使用emplace而不是placement new?您的程序并不等效 数据。安放数据。开始+49,参数;将新元素插入到向量中。这会增加向量大小并将元素移动到插入点之外
new&data[49]非平凡类型{param};覆盖现有元素。如果非平凡类型有一个非平凡的析构函数,则不首先破坏现有的元素,从而导致未定义的行为。我希望插入一个元素会产生比覆盖一个元素更多的代码。Vector必须在模板上分配空间,以便为新元素腾出空间,而且它还必须将每个元素移动到阵列中的一个位置。为什么要使用“新放置”而不是“安放”?他们正在做一些不同的事情。请看我对已接受答案的评论。@FrançoisAndrieux请量化概率。不,如果析构函数很小,它实际上不是未定义的行为。编辑:但无论如何,最好调用析构函数。任何人都可以在以后更改非平凡类型,这样现在就需要析构函数调用,而无法发现这个新错误。我仍然认为不要在任何情况下调用析构函数显式错误。“弗兰CouoOsand ReDurix好吧。好的,谢谢!我错误地认为emplace通过覆盖现有元素来构造对象。应该更仔细地阅读文档。
int main(){
// prepare some init parameters
InitParam param{/* some data */};
// construct an object at 50th position
new (&data[49]) NonTrivialType{param};
}