📅  最后修改于: 2023-12-03 14:39:51.815000             🧑  作者: Mango
在C++ STL中,emplace
和insert
是两个常用的函数,用于向容器中添加元素。
emplace
emplace
是在C++11中引入的函数,它的作用是通过调用构造函数来在容器中直接构造元素。与insert
不同,emplace
可以直接将元素构造在容器中,而不是通过拷贝或移动构造函数将其插入。
下面是一个示例,展示了emplace
函数的用法:
#include <iostream>
#include <vector>
struct MyStruct {
int x;
std::string s;
MyStruct(int x, const std::string& s) : x(x), s(s) {}
};
int main() {
std::vector<MyStruct> vec;
// 使用 emplace_back 直接将元素构造在容器中
vec.emplace_back(10, "hello world");
std::cout << vec[0].s << std::endl;
return 0;
}
在上面的示例中,我们创建了一个自定义结构体MyStruct
,然后使用emplace_back
函数将元素构造在容器中。这里我们传递了两个参数,第一个参数是int
类型的x
,第二个参数是const std::string&
类型的s
,这些参数将用于调用MyStruct
的构造函数。
insert
insert
函数是STL中添加元素的另一个常用函数。与emplace
不同,它可以使用已有的元素或值作为参数。
下面是一个示例,展示了insert
函数的用法:
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
// 插入元素 4 到容器开始位置之前
auto it = vec.insert(vec.begin(), 4);
// 插入元素 5 到容器结束位置
vec.insert(vec.end(), 5);
// 插入元素 6 到容器的第二个位置
vec.insert(vec.begin() + 1, 6);
for (auto& i : vec) {
std::cout << i << std::endl;
}
return 0;
}
在上面的示例中,我们创建了一个整型vector
,并使用insert
函数将元素插入到不同的位置。第一个插入的元素是4
,它被插入到容器的开头位置。第二个插入的元素是5
,它被插入到容器的结束位置。第三个插入的元素是6
,它被插入到容器的第二个位置。
emplace
和insert
的区别在于它们添加元素的方式不同。
使用emplace
时,我们直接在容器中构造元素,这可能会更加高效,因为它避免了多余的拷贝或移动操作。但是需要注意的是,我们必须传递正确的构造函数参数。
使用insert
时,我们可以使用已有的元素作为参数,这样就不需要传递要构造的元素的各个构造函数参数。但是这可能会导致拷贝或移动操作,这可能会影响性能。此外,如果容器中已经有该元素,insert
函数会返回一个指向该元素的迭代器,而不会添加新元素。
在编写C++程序时,emplace
和insert
都是非常有用的函数。它们的作用不同,使用的场景也不同,我们需要根据具体情况选择使用哪个函数。同时也要注意,为了避免不必要的数据拷贝或移动,我们应该尽量使用emplace
函数。