Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标准::向量::安放与放置新_C++_C++11 - Fatal编程技术网

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};
}