C++ STL 中的 unordered_map 操作符[]
在 C++ STL 中,unordered_map 是一个非常有用的容器,它是以 key-value 对的形式存储数据。相比于 map,unordered_map 更适合用于需要频繁插入元素和查找元素的场景。而对于 unordered_map 容器,[] 操作符是其中一个非常重要的操作。
unordered_map 容器
在使用 unordered_map 时,需要包含头文件
“` c++
#include <unordered_map>
using namespace std;
unordered_map<key_type, value_type> umap;
<pre><code class="line-numbers">其中 key_type 和 value_type 分别表示 unordered_map 中的键和值类型。可以使用 auto 关键字自动推导出类型,例如:
“` c++
#include <unordered_map>
using namespace std;
unordered_map<string, int> umap;
这个 unordered_map 中存储了 string 类型的键和 int 类型的值。
unordered_map 中的元素可以使用 insert 或 emplace 方法插入,使用 find 或 count 方法查询,使用 erase 方法删除。
下面是一个使用 unordered_map 的示例代码:
“` c++
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> umap; // 创建一个 unordered_map 容器
umap.insert(make_pair("apple", 3)); // 插入一个键值对
umap.emplace("banana", 5); // 插入一个键值对
cout << umap["apple"] << endl; // 输出某个键对应的值
if (umap.find("orange") != umap.end()) { // 查找某个键是否存在
cout << "Orange is in the map" << endl;
}
umap.erase("banana"); // 删除某个键值对
cout << "The size of the map is " << umap.size() << endl; // 输出容器大小
return 0;
}
<pre><code class="line-numbers">## [] 操作符
unordered_map 中的 [] 操作符可以实现根据键来访问元素,如果键不存在,则会插入一个新的键值对。如果键已经存在,则会更新键对应的值。
下面是一个使用 [] 操作符的例子:
“` c++
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> umap;
umap[“apple”] = 3; // 添加一个键值对
umap[“banana”] = 5; // 添加一个键值对
cout << umap[“apple”] << endl; // 输出某个键对应的值
cout << umap[“orange”] << endl; // 输出某个不存在的键对应的值
cout << “The size of the map is ” << umap.size() << endl; // 输出容器大小
return 0;
}
在上面的代码中,我们先添加了两个键值对,然后使用 [] 操作符输出了某个已存在的键对应的值,以及某个不存在的键对应的值。由于 orange 键不存在,所以会插入一个新的键值对,键为 orange,值为默认值 0。
需要注意的是,如果使用 [] 操作符访问不存在的键时,会插入一个新的键值对,并将值初始化为默认值,具体的默认值取决于值类型。例如,对于 int 类型的值,默认值为 0,对于 string 类型的值,默认值为空串。
下面是一个更复杂一些的例子,该例子展示了在 unordered_map 容器中使用自定义类型作为键:
“` c++
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
struct Point {
int x, y;
Point(int _x, int _y) : x(_x), y(_y) {}
bool operator<span class="text-highlighted-inline" style="background-color: #fffd38;">(const Point& other) const {
return x </span> other.x && y <span class="text-highlighted-inline" style="background-color: #fffd38;"> other.y;
}
};</span>
namespace std {
template <>
struct hash<Point> {
size_t operator()(const Point& p) const {
return hash<int>()(p.x) ^ hash<int>()(p.y);
}
};
}
int main() {
unordered_map<Point, int> umap;
Point p1(1, 2);
umap[p1] = 3; // 添加一个键值对
Point p2(3, 4);
umap.emplace(p2, 5); // 插入一个键值对
cout << umap[p1] << endl; // 输出某个键对应的值
Point p3(5, 6);
cout << umap[p3] << endl; // 输出某个不存在的键对应的值
cout << "The size of the map is " << umap.size() << endl; // 输出容器大小
return 0;
}
“`
在上面的代码中,我们定义了一个自定义类型 Point,然后在 unordered_map 容器中使用 Point 类型作为键。为了让 unordered_map 容器识别 Point 类型的键,我们需要定义一个 hash 函数来生成键的哈希值。
在使用 [] 操作符访问某个键时,会先调用 Point 类型的 操作符来判断两个键是否相等,如果相等,则返回对应的值;如果不相等,则会插入一个新的键值对,并将值初始化为默认值 0。
结论
在 C++ STL 中,unordered_map 是一个非常有用的容器,它可以帮助我们快速完成键值对的插入、查找和删除等操作。而 [] 操作符则是 unordered_map 中一个非常重要的操作,它可以帮助我们快速根据键来访问元素,如果键不存在则会插入一个新的键值对。但需要注意的是,如果使用 [] 操作符访问不存在的键时,会插入一个新的键值对,并将值初始化为默认值。因此,在使用 [] 操作符时需要谨慎处理。