一、Python中的字典
(一)基本概念
- 字典(
dict
)是Python中一种可变容器模型,用于存储键值对(key:value
)。字典的键必须是不可变类型(如字符串、数字或元组),而值可以是任意类型。 - 字典的特点:
- 键是唯一的。
- 无序(在Python 3.7之前是无序的,3.7及以后版本在实现上保持了插入顺序,但不应依赖此特性进行有序操作)。
- 基于哈希表实现,查找、插入和删除操作的平均时间复杂度为O(1)。
(二)创建字典
-
直接使用花括号创建
empty_dict = {} # 创建一个空字典 my_dict = {"name": "Alice", "age": 25, "is_student": False}
-
使用
dict
函数创建- 通过键值对列表创建:
dict_from_pairs = dict([("key1", "value1"), ("key2", "value2")])
- 通过关键字参数创建:
dict_from_kwargs = dict(key1="value1", key2="value2")
- 通过键值对列表创建:
(三)访问和操作字典
-
访问元素
- 使用
dict[key]
访问值:
如果键不存在,会抛出print(my_dict["name"]) # 输出Alice
KeyError
异常。 - 使用
get()
方法访问值:print(my_dict.get("age")) # 输出25 print(my_dict.get("gender", "Unknown")) # 输出Unknown,因为gender键不存在
- 使用
-
添加和修改元素
- 添加键值对:
my_dict["gender"] = "Female"
- 修改键值对:
my_dict["age"] = 26
- 添加键值对:
-
删除元素
- 使用
del
语句删除键值对:del my_dict["is_student"]
- 使用
pop()
方法删除键值对并返回值:value = my_dict.pop("age", None) # 删除age键,并将对应的值赋给value
- 使用
clear()
方法清空字典:my_dict.clear()
- 使用
-
检查键是否存在
- 使用
in
关键字:if "name" in my_dict: print("Key exists")
- 使用
(四)遍历字典
-
遍历键
for key in my_dict: print(key)
-
遍历值
for value in my_dict.values(): print(value)
-
同时遍历键和值
for key, value in my_dict.items(): print(key, value)
二、C++中的std::map
(一)基本概念
std::map
是C++标准模板库(STL)中的一种关联容器,用于存储键值对。它基于红黑树实现,保证了键的唯一性。- 特点:
- 键是唯一的。
- 有序,键会按照升序排列。
- 查找、插入和删除操作的时间复杂度为O(log n)。
(二)创建std::map
-
直接初始化
#include <map> #include <iostream> using namespace std; int main() { map<int, string> my_map = {{1, "Alice"}, {2, "Bob"}}; return 0; }
-
使用
insert()
方法my_map.insert(pair<int, string>(3, "Charlie"));
(三)访问和操作std::map
-
访问元素
- 使用
operator[]
访问值:
如果键不存在,cout << my_map[1] << endl; // 输出Alice
operator[]
会自动插入一个默认构造的值。 - 使用
at()
方法访问值:
如果键不存在,cout << my_map.at(2) << endl; // 输出Bob
at()
会抛出std::out_of_range
异常。
- 使用
-
添加和修改元素
- 添加键值对:
my_map[3] = "Charlie";
- 修改键值对:
my_map[1] = "Alice Updated";
- 添加键值对:
-
删除元素
- 使用
erase()
方法删除键值对:my_map.erase(1);
- 使用
clear()
方法清空整个map
:my_map.clear();
- 使用
-
检查键是否存在
- 使用
find()
方法:if (my_map.find(2) != my_map.end()) { cout << "Key exists" << endl; }
- 使用
(四)遍历std::map
-
使用迭代器遍历
for (auto it = my_map.begin(); it != my_map.end(); ++it) { cout << it->first << " " << it->second << endl; }
-
使用C++11范围
for
循环for (const auto& pair : my_map) { cout << pair.first << " " << pair.second << endl; }
三、C++中的std::unordered_map
(一)基本概念
std::unordered_map
也是C++标准模板库(STL)中的一种关联容器,用于存储键值对。它基于哈希表实现,保证了键的唯一性。- 特点:
- 键是唯一的。
- 无序,键值对的存储顺序是随机的。
- 查找、插入和删除操作的平均时间复杂度为O(1)。
(二)创建std::unordered_map
-
直接初始化
#include <unordered_map> #include <iostream> using namespace std; int main() { unordered_map<int, string> my_umap = {{1, "Alice"}, {2, "Bob"}}; return 0; }
-
使用
insert()
方法my_umap.insert(pair<int, string>(3, "Charlie"));
(三)访问和操作std::unordered_map
-
访问元素
- 使用
operator[]
访问值:
如果键不存在,cout << my_umap[1] << endl; // 输出Alice
operator[]
会自动插入一个默认构造的值。 - 使用
at()
方法访问值:
如果键不存在,cout << my_umap.at(2) << endl; // 输出Bob
at()
会抛出std::out_of_range
异常。
- 使用
-
添加和修改元素
- 添加键值对:
my_umap[3] = "Charlie";
- 修改键值对:
my_umap[1] = "Alice Updated";
- 添加键值对:
-
删除元素
- 使用
erase()
方法删除键值对:my_umap.erase(1);
- 使用
clear()
方法清空整个unordered_map
:my_umap.clear();
- 使用
-
检查键是否存在
- 使用
find()
方法:if (my_umap.find(2) != my_umap.end()) { cout << "Key exists" << endl; }
- 使用
(四)遍历std::unordered_map
-
使用迭代器遍历
for (auto it = my_umap.begin(); it != my_umap.end(); ++it) { cout << it->first << " " << it->second << endl; }
-
使用C++11范围
for
循环for (const auto& pair : my_umap) { cout << pair.first << " " << pair.second << endl; }