c++ unordered_map用法
时间: 2024-10-21 10:10:09 浏览: 66
`unordered_map`是C++标准库中的关联容器,它基于哈希表实现,用于存储键值对。其主要特点包括:
1. **快速查找**:由于内部使用哈希函数,对于随机访问的数据,插入、删除和查找操作的时间复杂度通常接近O(1)。
2. **无序性**:元素的存储顺序并不保证,与`map`不同,`unordered_map`不会保持键的排序。
3. **迭代器**:提供迭代器支持,可以遍历整个映射。
4. **自定义比较**:允许通过模板参数指定键或值的比较函数,例如`std::less<T>`默认用于数值类型的比较,而自定义函数则可以实现自定义排序规则。
使用`unordered_map`的基本步骤如下:
```cpp
#include <unordered_map>
// 创建一个unordered_map实例
std::unordered_map<std::string, int> myMap;
// 插入键值对
myMap["apple"] = 1;
myMap["banana"] = 2;
// 访问值
int count = myMap["apple"]; // 输出1
// 遍历
for (const auto& pair : myMap) {
std::cout << "Key: " << pair.first << ", Value: " << pair.second << "\n";
}
// 删除键值对
myMap.erase("banana");
相关问题
C++ unordered_map count方法
在C++标准库中,`unordered_map`是一个关联容器,它提供了键值对的无序存储。当你需要快速查找元素是否存在以及其出现次数时,可以使用它的`count`方法。
`count(key)`函数用于返回指定键对应的元素数量。如果键存在,则返回1;如果键不存在于映射中,则返回0。这个操作的时间复杂度通常是O(1),因为哈希表的查找非常高效。
例如:
```cpp
std::unordered_map<int, std::string> myMap;
// 插入一些元素
myMap[1] = "one";
myMap[2] = "two";
int countOfOne = myMap.count(1); // countOfOne将被设置为1
if (countOfOne > 0) {
std::cout << "Key 1 exists and appears " << countOfOne << " times." << std::endl;
} else {
std::cout << "Key 1 does not exist." << std::endl;
}
```
c++ unordered_map 用法
### C++ 中 `std::unordered_map` 的数据结构及使用方法
#### 数据结构概述
`std::unordered_map` 是一种关联容器,内部通过哈希表(hash table)来实现。它的主要特点是能够以平均常数时间复杂度完成插入、删除和查找操作[^1]。
#### 基本头文件
要使用 `std::unordered_map`,需要包含 `<unordered_map>` 头文件。
```cpp
#include <unordered_map>
```
#### 定义与初始化
可以通过多种方式定义并初始化一个 `std::unordered_map`:
```cpp
// 定义一个空的 unordered_map
std::unordered_map<int, std::string> myMap;
// 初始化时赋值
std::unordered_map<std::string, int> studentAges = {
{"Alice", 20},
{"Bob", 22}
};
```
#### 插入元素
可以使用 `insert()` 方法或者直接通过下标运算符 `[ ]` 来插入键值对[^3]。
```cpp
myMap.insert({42, "Answer"}); // 使用 insert() 方法
myMap[7] = "Lucky"; // 使用下标运算符
```
#### 查找元素
利用 `find()` 函数或下标访问已存在的键值对。如果尝试访问不存在的键,则会自动创建该键并将对应的值设为默认值(对于内置类型来说通常是零或其他类型的默认构造对象),这可能不是期望的行为。
```cpp
if(myMap.find(42) != myMap.end()) {
std::cout << "Found: " << myMap.at(42) << '\n'; // at() 抛出异常当找不到指定 key
}
// 下标访问存在风险
try{
std::cout << "Value of non-existing key is: " << myMap.at(99) << '\n';
} catch(std::out_of_range& e){
std::cerr << "Error: " << e.what() << '\n';
}
```
#### 遍历所有元素
遍历时可采用范围for循环或是传统的迭代器方式进行[^2]。
```cpp
// 范围 for 循环
for(auto const &[key, value] : studentAges){
std::cout << "Key: " << key << ", Value: " << value << "\n";
}
// 迭代器方式
for(auto it=studentAges.begin(); it!=studentAges.end(); ++it){
std::cout << "Student ID: " << (*it).first << "; Age: " << (*it).second << "\n";
}
```
#### 删除元素
支持单个元素删除以及清除整个容器内的所有元素。
```cpp
myMap.erase(42); // 移除特定 key 对应的 element
myMap.clear(); // 清空全部 contents
```
---
阅读全文
相关推荐
















