Map
C++ 标准模板库(STL)中的 map
容器是一种非常有用的关联容器,用于存储键值对(key-value pairs)。在 map
中,每个元素都由一个键和一个值组成,其中键是唯一的,而值则可以重复。
基本概念
- 键与值:键用于唯一标识一个元素,而值则是与键关联的数据。键和值通常以
std::pair
的形式存储,但在大多数操作中,你可以直接使用键和值。 - 排序:
map
中的元素会根据键的比较进行排序。默认情况下,键按照升序排列,但可以通过提供自定义的比较函数或比较对象来改变排序方式。 - 查找效率:由于
map
内部通常使用红黑树实现,查找、插入和删除操作的时间复杂度为 O(log N),其中 N 是容器中的元素数量。
声明和初始化
Cpp
#include <map>
#include <string>
#include <iostream>// 声明一个 map,键为 int 类型,值为 std::string 类型
std::map<int, std::string> myMap;// 初始化 map
std::map<int, std::string> myMap = {{1, "apple"},{2, "banana"},{3, "cherry"}
};
插入元素
Cpp
myMap.insert({4, "date"}); // 使用 make_pair 或者直接初始化 pair
myMap[5] = "elderberry"; // 使用 [] 操作符,如果键不存在,会自动创建一个新的元素
访问元素
Cpp
std::string fruit = myMap[3]; // 获取键为3的值
fruit = myMap.at(3); // 与[]类似,但会抛出异常如果键不存在
遍历 map
Cpp
for (const auto& element : myMap) {std::cout << element.first << ": " << element.second << std::endl;
}
或者使用迭代器:
Cpp
for (auto it = myMap.begin(); it != myMap.end(); ++it) {std::cout << it->first << ": " << it->second << std::endl;
}
可能遇到的错误:
1。C++版本不够
查看一下自己的版本
我这个就是C++98,像auto这些都需要C++11以上的版本,升级版本大家可以自行搜索。
常用函数
- find():查找键是否存在,返回指向键的迭代器或 end() 如果找不到。
- count():返回键的数量,对于 map 总是返回 0 或 1。
- erase():删除指定键的元素,可以接受键或迭代器作为参数。
- empty():检查 map 是否为空。
- size():返回 map 中的元素数量。
- clear():删除 map 中的所有元素。
多值映射 multimap
multimap
是 C++ STL 中的一个关联容器,它类似于 map
,但是它允许一个特定的键对应多个值。这意味着在 multimap
中,键可以不是唯一的,相同键的多个元素会被存储在一起,并且这些元素将根据它们的键按升序排序。
-
键值对存储:
multimap
存储键值对,其中键用于索引,值是与键相关联的数据。键和值分别定义为模板参数的类型。 -
键的非唯一性: 不同于
map
,multimap
允许有多个元素拥有相同的键。这意味着你可以存储多个与同一键关联的值。 -
自排序:
multimap
内部使用红黑树(一种自平衡的二叉搜索树)实现,这意味着元素会根据键的值自动排序。默认情况下,键按照升序排序,但你可以通过提供自定义的比较函数或比较对象来改变排序规则。 -
高效查找、插入和删除: 由于使用了红黑树结构,
multimap
的查找、插入和删除操作的时间复杂度都是 O(log n),其中 n 是容器中的元素数。 -
迭代器稳定: 当使用
erase
函数删除一个元素时,不会影响其他元素的位置,因此指向未被删除元素的迭代器和引用仍然是有效的。 -
成员函数:
multimap
提供了一系列成员函数,如insert
、erase
、find
、count
、equal_range
等,用于操作和查询容器。 -
大小和容量: 它提供了
size
、empty
和max_size
成员函数,用于检查容器的当前大小、是否为空以及最大可能的大小。 -
迭代器和反向迭代器:
multimap
支持正向迭代器和反向迭代器,允许你遍历整个容器或反向遍历容器。 -
键值对的访问: 你可以使用
begin
和end
成员函数获得迭代器,然后通过迭代器访问键值对。multimap
不支持operator[]
,因为键可能不是唯一的,但提供了at
函数来访问键存在的元素,如果键不存在,at
将抛出std::out_of_range
异常。
简单示例
#include <map>
#include <iostream>using namespace std;std::multimap<int, std::string> myMultimap;int main(int argc, char const *argv[])
{myMultimap.insert(std::make_pair(1, "apple"));myMultimap.insert(std::make_pair(1, "orange"));auto it = myMultimap.find(1);auto range = myMultimap.equal_range(1);for (const auto &element : myMultimap){std::cout << element.first << ": " << element.second << endl;}std::cout << "delete data" << std::endl;myMultimap.erase(myMultimap.begin()); // 删除第一个元素myMultimap.erase(1); // 删除所有键为1的元素for (const auto &element : myMultimap){std::cout << element.first << ": " << element.second << endl;}return 0;
}
常用函数
-
insert(const value_type& val)
和insert(value_type&& val)
: 向multimap
插入一个元素。可以插入一个键值对,如果键已经存在,新值将被插入在现有相同键值对后面。 -
insert(InputIterator first, InputIterator last)
: 插入从迭代器first
到last
的一系列元素。 -
insert(const_iterator hint, const value_type& val)
: 插入一个元素,并给出一个迭代器作为插入点的提示,但实际插入位置由键的顺序决定。 -
erase(const key_type& k)
: 删除所有键为k
的元素,返回被删除的元素数量。 -
erase(iterator position)
: 删除由position
指向的单个元素。 -
erase(iterator first, iterator last)
: 删除由[first, last)
范围内的所有元素。 -
swap(multimap& x)
: 与另一个multimap
交换内容。 -
clear()
: 清空multimap
,移除所有元素。 -
find(const key_type& k)
: 返回指向第一个键为k
的元素的迭代器,如果未找到则返回end()
。 -
count(const key_type& k)
: 返回键为k
的元素数量。 -
equal_range(const key_type& k)
: 返回键为k
的所有元素的范围,返回一个包含两个迭代器的std::pair
,分别指向第一个和最后一个键为k
的元素。