Associative Containers

关联容器

  • 关联容器类型

使用关联容器

  • 使用关联数组的一个典型例子是单词数统计:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // count the number of times each word occurs in the input
    map<string, size_t> word_count; // empty map from string to size_t
    string word;
    while (cin >> word)
    ++word_count[word]; // fetch and increment the counter for word
    for (const auto &w : word_count) // for each element in the map
    // print the results
    cout << w.first << " occurs " << w.second
    << ((w.second > 1) ? " times" : " time") << endl;
  • word不存在于map中,下标操作会创建一个键为word值为0的元素。

  • 当我们从map中获取一个元素时,得到的元素类型为pair

关联容器概述

定义关联容器

  • C++ 11标准下,关联容器可以进行列表初始化:
1
2
3
4
5
6
7
8
9
map<string, size_t> word_count;  // empty
// list initialization
set<string> exclude = {"the", "but", "and", "or", "an", "a",
"The", "But", "And", "Or", "An",
"A"};
// three elements; authors maps last name to first
map<string, string> authors = { {"Joyce", "James"},
{"Austen", "Jane"},
{"Dickens", "Charles"} };
  • mapset中的键必须是唯一的,一个键只能对应容器中的一个元素;multimapmultiset没有这个限制,可以有多个元素具有相同的键。

键类型的要求

  • 默认情况下,标准库使用键类型的<运算符来比较两个键。

  • 对于没有<运算符的类型,可以在模板参数中提供比较操作类型(函数指针):

    1
    2
    3
    4
    5
    bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
    {
    return lhs.isbn() < rhs.isbn();
    }
    multiset<Sales_data, decltype(compareIsbn)*> bookstore(compareIsbn);
  • 对函数名使用decltype时,必须添加*才能得到函数指针类型。

pair类型

  • pair的默认构造函数对数据成员进行值初始化。
  • pair上的操作

关联容器操作

  • 关联容器的额外类型别名

关联容器迭代器

  • set类型定义了iteratorconst_iterator类型,但两种迭代器对set的元素都只能进行只读访问。

添加元素

  • 关联容器insert操作

删除元素

  • 从关联容器中删除元素

map的下标操作

  • mapunordered_map的下标操作

访问元素

  • 在一个关联容器中查找元素的操作

无序容器

  • 无序容器管理操作

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!