📜  具有键作为用户的C++映射定义数据类型(1)

📅  最后修改于: 2023-12-03 15:36:48.369000             🧑  作者: Mango

C++映射定义数据类型

C++ 中的映射数据类型是一种将键和值配对的数据结构,也称为关联数组或字典。每个键在映射中只能出现一次,并映射到一个特定的值。C++ 中有多种实现映射的方式,其中一种常用的方式是使用 STL 的 map

STL Map

map 是一个关联容器,将值(value)与钥匙(key)相关联。 map 保证元素按其键的顺序存储(以升序或字典顺序)。 map 具有以下特点:

  • 始终根据其键排序
  • 每个键只能在 map 中出现一次
  • 插入,删除和查找操作具有对数复杂度 O(log n)
  • 可以通过迭代器遍历 map

下面是 map 的定义:

template <
  class Key,
  class T,
  class Compare = std::less<Key>,
  class Allocator = std::allocator<std::pair<const Key, T>>
> class map;

其中,Key 类型是关键字(键)类型,T 是每个关键字对应的值类型。 Compare 是一个可选的比较函数对象,用于比较元素的顺序。 如果未提供比较器,则键类型 Key 必须支持 < 操作符。 Allocator 类型表示用于配置和释放底层存储的空间的分配器类型(默认情况下使用 std::allocator)。

下面是 map 的基本用法示例。

#include <iostream>
#include <map>

int main() {
  std::map<std::string, int> age; // 创建一个映射,键为字符串,值为整数

  // 向 map 中插入元素
  age["Mike"] = 40;
  age["John"] = 35;
  age["Sarah"] = 28;

  // 访问 map 中的元素
  std::cout << "Mike's age: " << age["Mike"] << std::endl;

  // 查找 map 中的元素
  if (age.find("John") != age.end()) {
    std::cout << "John's age: " << age["John"] << std::endl;
  }

  // 删除 map 中指定键的元素
  age.erase("Sarah");

  // 使用迭代器遍历 map
  std::cout << "All ages:" << std::endl;
  for (auto itr = age.begin(); itr != age.end(); itr++) {
    std::cout << itr->first << ": " << itr->second << std::endl;
  }

  return 0;
}
自定义比较器

在某些情况下,我们可能需要自定义比较器来指定元素的排序方式。以下是一个自定义比较器示例,演示如何按字符串长度排序元素。

#include <iostream>
#include <map>
#include <string>

// 按字符串长度比较函数
class LengthCompare {
public:
  bool operator() (const std::string& s1, const std::string& s2) const {
    return s1.length() < s2.length();
  }
};

int main() {
  std::map<std::string, int, LengthCompare> age; // 使用自定义比较器

  age["Mike"] = 40;
  age["John"] = 35;
  age["Sarah"] = 28;

  std::cout << "By length:" << std::endl;
  for (auto itr = age.begin(); itr != age.end(); itr++) {
    std::cout << itr->first << ": " << itr->second << std::endl;
  }

  return 0;
}
总结

使用 C++ 中的映射数据类型可以轻松地将键值对存储起来,以便后续使用。 C++ STL 中提供了 map 来实现映射数据类型,并且提供了许多内置函数和算法来帮助开发人员实现就地操作。开发人员也可以通过自定义比较器或分配器等方式来进一步扩展其功能。