std::unordered_map
是 C++ 标准库中的一个关联容器,它提供了平均常数时间复杂度的元素查找、插入和删除操作。如果你想要在 std::unordered_map
中仅在新元素不存在时插入新元素,并且希望这是最快的方法,你可以使用 insert
成员函数或者 operator[]
的组合。
insert
成员函数insert
成员函数会返回一个 pair
,其中 first
是指向被插入元素的迭代器(如果插入成功)或指向已经存在的相同键的元素的迭代器(如果插入失败),second
是一个布尔值,指示插入是否成功。
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> myMap;
// 尝试插入一个新元素
auto result = myMap.insert(std::make_pair(1, "One"));
if (result.second) {
std::cout << "Element inserted successfully." << std::endl;
} else {
std::cout << "Element already exists." << std::endl;
}
// 尝试插入一个已经存在的元素
result = myMap.insert(std::make_pair(1, "Another One"));
if (result.second) {
std::cout << "Element inserted successfully." << std::endl;
} else {
std::cout << "Element already exists." << std::endl;
}
return 0;
}
operator[]
operator[]
会检查键是否存在,如果不存在,则会创建一个新的元素并返回其引用。但是,这种方式会默认构造键对应的值,如果你的值类型没有默认构造函数,这将是一个问题。此外,即使元素已经存在,operator[]
也会替换现有的值。
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> myMap;
// 使用 operator[] 插入或更新元素
myMap[1] = "One";
// 检查元素是否存在
if (myMap.find(1) != myMap.end()) {
std::cout << "Element exists with value: " << myMap[1] << std::endl;
}
// 尝试插入一个已经存在的元素,这将更新值
myMap[1] = "Another One";
return 0;
}
insert
方法通常比 operator[]
更高效,因为它不会默认构造值,也不会在元素已存在时替换值。unordered_map
很大,确保你的哈希函数和桶的数量是优化的,以减少冲突并保持平均常数时间复杂度。insert
是更好的选择。operator[]
可能更适合。请注意,上述代码示例仅用于说明目的,实际应用中可能需要根据具体情况进行调整。
领取专属 10元无门槛券
手把手带您无忧上云