c++ map,mutimap删除问题分析


在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`中,由于键的唯一性,删除操作相对简单直接。