📜  C++ STL中的unordered_map运算符[](1)

📅  最后修改于: 2023-12-03 14:59:46.877000             🧑  作者: Mango

C++ STL中的unordered_map运算符[]

介绍

在C++ STL(标准模板库)中,unordered_map是一个基于哈希表实现的关联容器,它可以用来存储键值对。哈希表是一种高效的数据结构,能够以常数时间O(1)的复杂度进行插入、查找、删除等操作。

unordered_map中提供了运算符[],我们可以利用它来访问/修改容器中的元素。如果指定的键存在,[]将返回与之关联的值;如果键不存在,则会创建新的键值对。

接下来我们来详解unordered_map运算符[]的使用方法和注意事项。

语法

下面是unordered_map运算符[]的语法:

unordered_map[key] = value;  // 存储键值对
unordered_map[key];         // 访问键对应的值
用法

假设我们需要统计一段英文文本中单词出现的次数,我们可以使用unordered_map[]运算符来统计:

#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

int main()
{
    unordered_map<string, int> word_count;  // 存储单词及其出现次数
    string word;
    while (cin >> word) {                   // 从标准输入读取单词
        ++word_count[word];                 // 统计单词出现次数
    }
    for (const auto& w : word_count) {      // 遍历unordered_map
        cout << w.first << " appears " << w.second << " times." << endl;
    }
    return 0;
}

上述代码中,我们创建了一个unordered_map对象word_count来存储单词及其出现次数。在读入单词时,我们可以直接使用[]运算符来访问和修改unordered_map中的元素,如果单词不存在,[]会创建一个新的键值对,然后将其值置为0再加1。

在遍历word_count输出结果时,我们使用了const auto&来声明遍历过程中的键值对,这样可以避免复制pair对象,提高遍历的效率。

注意事项
  • 当使用[]运算符访问容器中不存在的键时,会自动将其插入到unordered_map中,并将其值初始化为默认值(数值为0,string为空字符串等)。
  • 在使用[]运算符修改容器中的元素时,如果指定的键不存在,它会自动创建一个新的键值对,然后将其值置为指定的值。
  • 如果unordered_map的键类型是自定义类型,需要定义hash函数来实现哈希化,否则程序将无法编译通过。
  • unordered_map提供了at函数和find函数来查找指定的键和访问相应的值,但是它们与[]运算符不同,当指定的键不存在时,at函数会抛出out_of_range异常,而find函数将返回unordered_map::end()迭代器。因此在使用at函数和find函数时需要注意异常处理和迭代器判断。
总结

在使用C++ STL中的unordered_map中,[]运算符是一个非常方便的工具,它能够实现对容器中元素的快速访问和修改,并且可以通过自定义类型和哈希函数来适应不同的需求。同时需要注意的是,在使用unordered_map时需要注意异常处理和迭代器判断,以免出现程序崩溃等问题。