概述
要实现类似Python字典的操作,本质上就是实现键值对的存储。
在C++中,咱们通常会使用 std::unordered_map
或std::map
(建议根据具体需求选择)。这两个容器都提供了键值对的存储机制,但它们在内部实现和性能上有所不同。
0. 使用std::unordered_map
std::unordered_map
是基于哈希表的实现,它提供了平均常数时间复杂度的查找、插入和删除操作。但是,最坏情况下的时间复杂度可能会退化到线性时间(尽管这种情况很少见)。
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
std::unordered_map<std::string, int> dict;
// 添加键值对
dict["apple"] = 100;
dict["banana"] = 200;
// 访问元素
std::cout << "apple: " << dict["apple"] << std::endl;
// 检查键是否存在
if (dict.find("orange") == dict.end()) {
std::cout << "orange not found" << std::endl;
}
// 遍历map
for (const auto& pair : dict) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
1. 使用std::map
std::map
是基于红黑树的实现,它保证了元素按键的升序排列。因此,std::map
提供了对数时间复杂度的查找、插入和删除操作。如果你需要按键的顺序进行迭代,那么std::map
可能是更好的选择。
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> dict;
// 添加键值对
dict["apple"] = 100;
dict["banana"] = 200;
// 访问元素
std::cout << "banana: " << dict["banana"] << std::endl;
// 检查键是否存在
if (dict.find("orange") == dict.end()) {
std::cout << "orange not found" << std::endl;
}
// 遍历map(按键的顺序)
for (const auto& pair : dict) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
选择std::unordered_map
还是std::map嘞
?
- 如果你需要快速的查找、插入和删除操作,并且不关心元素的顺序,那么
std::unordered_map
是更好的选择。 - 如果你需要按键的顺序来迭代元素,那么
std::map
更适合你的需求。
注意
- 当使用
std::unordered_map
时,如果键的类型是自定义类型,你需要提供一个哈希函数和相等比较函数。 - 访问
std::unordered_map
或std::map
中不存在的键时,std::map
会抛出一个异常(如果你使用的是C++11或更高版本且启用了异常),而std::unordered_map
会插入一个默认构造的键值对(如果你使用的是C++17的try_emplace
或类似方法,则可以避免这一点)。为了避免这种情况,通常先使用find
方法检查键是否存在。
// 注:文章内容参考文心一言的解答
~ 希望对你有帮助 ~