在C++中,<map>
头文件提供了一种关联容器,它存储的是键值对(std::pair
),并且会自动根据键进行排序。以下是一些常用的 map
函数及其使用方式:
-
插入元素:
insert(const value_type& val)
或insert(initializer_list init)
用于插入元素。std::map<int, std::string> myMap; myMap.insert(std::make_pair(1, "one")); myMap.insert({2, "two", 3, "three"});
-
访问元素:
at(const Key& key)
返回键对应值的引用,如果键不存在则抛出异常。std::string value = myMap.at(2); // "two"
-
查找元素:
find(const Key& key)
返回一个指向找到元素的迭代器,如果没有找到则返回end()
。auto it = myMap.find(2); if (it != myMap.end()) { std::cout << it->second << std::endl; // 输出 "two" }
-
删除元素:
erase(Iterator pos)
或erase(const Key& key)
用于删除元素。myMap.erase(2); // 删除键为2的元素
-
获取元素数量:
size()
返回map
中元素的数量。std::cout << "Size: " << myMap.size() << std::endl;
-
清空容器:
clear()
移除所有元素。myMap.clear();
-
检查容器是否为空:
empty()
检查map
是否为空。if (myMap.empty()) { std::cout << "The map is empty." << std::endl; }
-
获取迭代器:
begin()
和end()
分别返回指向第一个元素和最后一个元素之后的迭代器。for (auto it = myMap.begin(); it != myMap.end(); ++it) { std::cout << it->first << " => " << it->second << std::endl; }
-
获取键的总数:
count(const Key& key)
返回键在map
中出现的次数。std::cout << "Count of key 2: " << myMap.count(2) << std::endl;
-
获取键值对的范围:
equal_range(const Key& key)
返回一个包含两个迭代器的pair
,分别指向键值对的范围的开始和结束。
auto range = myMap.equal_range(2);
for (auto it = range.first; it != range.second; ++it) {
std::cout << it->first << " => " << it->second << std::endl;
}
在竞赛过程中,使用 `map` 的细节包括:
- **性能**:`map` 的插入、删除和查找操作的时间复杂度为 O(log n),其中 n 是 `map` 中元素的数量。
- **内存使用**:`map` 可能需要比数组或向量更多的内存,因为它需要存储额外的信息来维护元素的排序。
- **迭代器失效**:在对 `map` 进行插入或删除操作后,之前的所有迭代器可能会失效,需要重新获取迭代器。
- **元素唯一性**:`map` 中的键必须是唯一的,尝试插入重复的键将不会成功。
以上是 `<map>` 头文件中一些常用函数的介绍,以及在竞赛编程中的使用细节。在实际编程中,应根据具体需求选择合适的容器和操作。