如何更新map、multimap中得key

本文详细介绍了如何在STL库中使用map和multimap类通过插入和删除操作来更新常量键字段的值,并提供了一个自定义函数用于实现这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看一下在stl中的语法:

template <typename K, typename V, typename Compare = less<K>, typename Allocator = allocator<pair<const K, V> > > class map; template <typename K, typename V, typename Compare = less<K>, typename Allocator = allocator<pair<const K, V> > > class multimap;

map和multimap的定义差不多,除了multimap可以有多个相同的key值, map根据Compare来对key进行排序,Compaer可以是less,greater等stl自带的,你也可以自己定义Compare。

现在回到正题,如何改变key值,其实没有什么办法,只有选择插入删除操作:即插入新的pair对,删除旧的pair对。 详见下面的code:

namespace My_Utility{
template <typename CONTAINER>
    void replace_key(CONTAINER& container,
                     const typename CONTAINER::key_type& oldKey,
                     const typename CONTAINER::key_type& newKey)
    {
        if(!container.key_comp()(oldKey,newKey) && !container.key_comp()(newKey,oldKey)){
	    return;} //Thanks to Graham for this Fix
        typename CONTAINER::iterator begin(container.find(oldKey));
        for(;;){
            if(begin != container.end()){
                container.insert(typename CONTAINER::value_type(newKey, begin->second));
                container.erase(begin); // Thanks to Graham for this potential fix
                begin = container.find(oldKey);
            }
            else{
                return;
            }
        }
    }
}

原文链接: http://www.codeproject.com/Articles/36326/How-To-Update-Your-Const-Key-Fields-in-a-Map-Multi

### C++ 中 `std::map` 和 `std::multimap` 的区别及用法 #### 定义与基本概念 `std::map` 是一种关联容器,用于存储键对(key-value pairs),其中每个键都是唯一的。它基于红黑树实现,因此提供了高效的查找、插入和删除操作[^1]。 相比之下,`std::multimap` 也是一种关联容器,但它允许同一个键存在多个映射。换句话说,在 `std::multimap` 中,相同的键可以对应不同的[^2]。 --- #### 主要区别 | 特性 | `std::map` | `std::multimap` | |---------------------|------------------------------------|-------------------------------------| | **唯一键约束** | 键必须唯一 | 同一键可有多个对应的 | | **内部结构** | 基于平衡二叉搜索树 | 类似 `std::map` | | **迭代器行为** | 迭代器指向单个键对 | 可能返回具有相同键的多个键对 | --- #### 使用方法 以下是两个容器的基本使用方式: ```cpp #include <iostream> #include <map> int main() { std::map<int, std::string> myMap; myMap[1] = "Apple"; myMap[2] = "Banana"; for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << "\n"; } return 0; } ``` 对于 `std::multimap`,由于允许多个键的存在,其访问逻辑稍显复杂。下面是一个简单的例子展示如何遍历重复键的: ```cpp #include <iostream> #include <map> int main() { std::multimap<int, std::string> myMultiMap; myMultiMap.insert({1, "Red"}); myMultiMap.insert({1, "Green"}); myMultiMap.insert({2, "Blue"}); for (const auto& pair : myMultiMap) { std::cout << pair.first << ": " << pair.second << "\n"; } // 查找特定键的所有条目 int keyToFind = 1; auto range = myMultiMap.equal_range(keyToFind); for (auto it = range.first; it != range.second; ++it) { std::cout << "Key " << keyToFind << " maps to " << it->second << "\n"; } return 0; } ``` 上述代码展示了如何通过 `equal_range()` 方法获取指定键的所有映射项。 --- #### 性能比较 两者都提供 O(log n) 时间复杂度的操作性能,但由于 `std::multimap` 支持多映射,可能在某些场景下需要额外处理来管理冗余数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值