std::map
是 C++ 标准库中的一个关联容器,它存储键值对,并根据键自动排序。emplace
和 try_emplace
是 std::map
提供的两个成员函数,用于在容器中插入元素。
emplace
函数尝试在 std::map
中直接构造一个元素,而不是先构造一个临时对象再复制或移动到容器中。这可以避免不必要的复制或移动操作,从而提高性能。
函数原型如下:
template< class... Args >
pair<iterator,bool> emplace( Args&&... args );
Args&&... args
:传递给元素构造函数的参数。pair
,其中 first
是指向新插入元素的迭代器,second
是一个布尔值,表示是否成功插入了新元素。try_emplace
函数与 emplace
类似,但它只在键不存在于 std::map
中时才构造元素。如果键已经存在,则不会进行任何操作。
函数原型如下:
template< class... Args >
pair<iterator,bool> try_em::place( const Key& key, Args&&... args );
template< class... Args >
pair<iterator,bool> try_emplace( Key&& key, Args&&... args );
Key
是键的类型,Args&&... args
是传递给元素构造函数的参数。emplace
相同,是一个 pair
,其中 first
是指向新插入元素或已存在元素的迭代器,second
是一个布尔值,表示是否成功插入了新元素。emplace
无论键是否存在都会尝试构造元素,如果键已经存在,则会替换现有元素。try_emplace
只在键不存在时才构造元素,如果键已经存在,则不会进行任何操作。emplace
和 try_emplace
都可以避免不必要的复制或移动操作,从而提高性能。try_emplace
可以减少不必要的元素构造,特别是在键已经存在的情况下。std::map
中插入元素,并且希望避免不必要的复制或移动操作时,可以使用 emplace
或 try_emplace
。try_emplace
。#include <iostream>
#include <map>
int main() {
std::map<int, std::string> myMap;
// 使用 emplace 插入元素
auto result1 = myMap.emplace(1, "Hello");
if (result1.second) {
std::cout << "Element emplaced successfully." << std::endl;
} else {
std::cout << "Element already exists." << std::endl;
}
// 使用 try_emplace 插入元素
auto result2 = myMap.try_emplace(2, "World");
if (result2.second) {
std::cout << "Element emplaced successfully." << std::endl;
} else {
std::cout << "Element already exists." << std::endl;
}
// 尝试使用 try_emplace 插入已存在的键
auto result3 = myMap.try_emplace(1, "New Value");
if (result3.second) {
std::cout << "Element emplaced successfully." << std::endl;
} else {
std::cout << "Element already exists, no change made." << std::endl;
}
return 0;
}
在这个示例中,我们创建了一个 std::map
,并使用 emplace
和 try_emplace
插入元素。注意观察输出结果,可以看到 try_emplace
在键已经存在时不会插入新元素。
领取专属 10元无门槛券
手把手带您无忧上云