在C++中,`std::map` 和 `std::multimap` 是基于红黑树实现的关联容器,它们允许我们存储键值对(key-value pairs)。对于删除操作,两者在处理上有所不同,主要是由于它们各自的特点所决定的。
### `std::map`
在`std::map`中,每个键(key)都是唯一的。当你想要删除一个元素时,你通常会通过键来查找该元素。如果找到了,就删除它。
#include <map>
#include <iostream>
int main() {
std::map<int, std::string> myMap;
// 插入元素
myMap[1] = "one";
myMap[2] = "two";
// 删除键为2的元素
if (myMap.erase(2)) {
std::cout << "Element with key 2 has been erased." << std::endl;
} else {
std::cout << "Element with key 2 not found." << std::endl;
}
// 尝试访问已删除的元素(将不会找到)
if (myMap.find(2) == myMap.end()) {
std::cout << "Key 2 not found after erase." << std::endl;
}
return 0;
}
### `std::multimap`
与`std::map`不同,`std::multimap`允许存储多个具有相同键的元素。因此,当你尝试通过键来删除元素时,你需要决定是删除所有具有该键的元素,还是只删除一个。
- **删除所有具有特定键的元素**:你不能直接通过一个操作完成,但可以通过迭代器遍历并删除。
- **删除第一个(或特定位置的)具有特定键的元素**:可以通过结合`find`方法和`erase`方法实现。
#include <multimap>
#include <iostream>
int main() {
std::multimap<int, std::string> myMultimap;
// 插入元素
myMultimap.insert({1, "one"});
myMultimap.insert({2, "two"});
myMultimap.insert({2, "two again"});
// 删除第一个键为2的元素
auto it = myMultimap.find(2);
if (it != myMultimap.end()) {
myMultimap.erase(it);
std::cout << "First element with key 2 has been erased." << std::endl;
}
// 如果需要删除所有键为2的元素,则需要遍历
while ((it = myMultimap.find(2)) != myMultimap.end()) {
myMultimap.erase(it);
}
return 0;
}
在`std::multimap`中,由于键可能不唯一,所以删除操作需要更仔细地处理,特别是当你想要删除所有具有特定键的元素时。而在`std::map`中,由于键的唯一性,删除操作相对简单直接。