一、区别
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_STRUCT *vsarray, ULONG value)
{
VALUE_STRING_STRUCT *tmp = vsarray;
while ( tmp->string != NULL )
{
if ( tmp->value ==