C++ STL insert和emplace函数区别
insert
和 emplace
是 C++ STL 容器中用于插入元素的两个不同函数,主要区别在于对象的传递和构造方式。
1. 参数传递方式
insert
:需要传入一个已经构造好的对象,该对象会被拷贝或移动到容器中。
示例:std::vector<std::pair<int, std::string>> v; v.insert(v.end(), std::make_pair(1, "one")); // 先构造pair对象,再插入
emplace
:直接在容器内部构造元素,参数是构造元素所需的实参,无需预先创建对象。
示例:
std::vector<std::pair<int, std::string>> v;
v.emplace(v.end(), 1, "one"); // 直接传递参数构造对象
2. 性能差异
insert
通常涉及临时对象的创建,可能带来额外的拷贝或移动开销。emplace
避免了临时对象的创建,直接在容器内存中构造对象,通常效率更高。
3. 使用场景
- 当需要插入已存在的对象时,使用
insert
。 - 当可以就地构造对象且希望避免额外拷贝时,使用
emplace
。
4. 示例对比
std::map<int, std::string> m;
// insert 需要显式构造 pair
m.insert(std::make_pair(1, "one"));
// emplace 直接传递参数构造 pair
m.emplace(2, "two");
5. 返回值
- 两者均返回一个指向插入元素的迭代器和一个布尔值,指示插入是否成功。
综上,emplace
通常比 insert
更高效,因为它避免了不必要的临时对象构造和拷贝操作,特别是在元素类型构造复杂时推荐使用。