c++ map、multimap 的使用方法

本文详细介绍了C++中的map和multimap的区别及使用方法,包括它们的构造、添加数据、查找、删除等操作。map提供一对一的关系,元素自动按key升序排序,而multimap允许多对一的关系,同样有序,但不支持通过[]操作符访问。此外,还提到了unordered_map和unordered_multimap作为无序替代方案。

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

一、区别

1. Map:一对一;有序( 自动按 key 升序 );可用 [ ] 赋值和取值;采用 红黑树 结构;实现O(lgn)的查找,插入和删除

2. Mulitimap:多对多;有序( 自动按 key 升序 );无[ ] 操作;可自定义排序函数;采用 红黑树 结构

                multimap<char, int, less<char> > --->less<char>为默认函数,较小的放在前面 即:升序排序

                multimap<char, int, greater<char> > --->greater<char> 系统函数 较大的放前 即:降序排序【可传入自定义排序函数】
3. unordered_map:无序map,采用 hash table 结构

4. unordered_mulitimap:无序mulitimap,采用 hash table 结构

5. map 与 unordered_map 使用时机

map

>通常使用red-black tree实现.
元素被排序.
>相对较小的内存使用(不需要额外的内存用于哈希表).
>相对快速查找:O(log N).

unordered_map

>通常使用hash-table实现.
元素没有排序.
>需要额外的内存来保留哈希表.
>快速查找O(1),但是恒定时间取决于可能相对较慢的hash-function.还要记住,你可以见到Birthday problem.

有序容器里的数据是按关键字字典顺序进行存储存放的。

二、Map

Map是c++的一个标准容器,它提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!
1. map构造函数;
map<string , int >mapstring; map<int ,string >mapint;
map<sring, char>mapstring; map< char ,string>mapchar;
map<char ,int>mapchar; map<int ,char >mapint;

如在打枚举中打印 “指定值对应的字符串”时,可是采用map<int, string>的STL实现。

static inline const char * 
VNET_TYPE_STRING(vnet_type_t type)
{
    static VALUE_STRING_STRUCT g_type_string[] =
    {
        { VNET_TYPE_UNKOWN, "unkown1" },
        { VNET_TYPE_SOCKET, "socket" },
        { VNET_TYPE_RDP,    "rdp" },
        { VNET_TYPE_PCOIP,  "pcoip" },
        { VNET_TYPE_ICA, "ica" },
		{ VNET_TYPE_XRED, "xred" },
        { 0, NULL },
    };
    return GetValueString(g_type_string, (ULONG)type);
}

static inline const TCHAR *
GetValueString(VALUE_STRING_S
### 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、付费专栏及课程。

余额充值