C++stl map 超详细解说!!!

1.使用时要包含头文件 #include<map>,不要忘记了

2.基本介绍

格式:map<key, value>

key:键值   value:实值 

map中的元素是一些关键字-值(key-value)对;

map容器通常被称为关联数组,但其下标不必为整数;

key与value相当于绑定在一起,每一个不同的key对应于一个value,因此map容器中元素总是成对出现,而key起到索引的作用,可以凭借它很方便的找到value的值。

所有元素都会根据元素的键值(key)自动排序。

当使用一个迭代器遍历map时,迭代器按关键字升序遍历元素。

举例:一个班的学生中,每个同学的学号不一样,学号即为key,而每个key对应着一个学生的名字,这个名字就是value。而老师通过学号可以很快找到对应的学生的名字,而且学号自动排序,在print出来的时候是按照学号顺序的而非乱序。

3.map与multimap的相同点与不同点

相同点:

map/multimap都属于关联式容器,底层结构用二叉树实现;

都定义在头文件map。

不同点:

map不允许有重复的key(可以有重复的value),multimap允许有重复的key(multimap是key可重复出现的map)。

重复的key重复实际上是指一个key可以与多个value相关联,这些元素(value)会在容器中相邻位子储存。

举例:在统计单词数量的map中每个单词只能有一个元素;但是在词典中,一个单词可能会有多个含义。

4.pair类型

pair是标准库类型,它定义在头文件utility中;

类似容器,pair是一个用来生成特定容器的模板;

一个pair保存两个数据成员,与其他标准库类型不同,pair的数据成员是public的,两个成员名分别为first,second;

map的元素是pair,不难想到,key对应first,value对应second。

标准库只定义了有限的几个pair 的操作:

5.关联容器操作

key_type是key的类型

mapped_type是value的类型

value_type是pair<,>类型

6.有关迭代器

//map迭代器解引用是一个指向pair< , >对象的引用,因此可以用   迭代器   -> (pair)的数据成员(first或second)来访问成员

//遍历map

这里用的cbegin()、cend()表明返回的是const_iterator。

补充知识:iterator、const_iterator都可以用来遍历map,但是iterator可以改变其指向的元素的值,const_iterator只能访问不能改变,但是const_iterator自己本身是可以改变的(向前移、向后移),只是指向的值不能改变。

7.map容器与算法

关联容器定义了一个名为find的成员,它通过一个给定的关键字直接获取元素。我们用泛型find算法来找一个元素,但此算法会进行顺序搜索。而使用关联容器定义的专用find成员会比调用泛型find快得多。

8.对map对象的操作

1.添加元素:

使用成员函数insert(向容器中添加一个元素或一个元素的范围);

插入一个已存在的元素对容器没有任何影响;

//几种insert()的方法

//检测insert的返回值

注意看对于map的insert函数的返回值返回的是一个pair,它的first是一个指向具有给定关键字元素的迭代器secondbool值。

//对于multimap这样可以有重复key的容器,无须返回bool值,返回的是一个指向新元素的迭代器

2.删除元素

使用erase函数

如果传递给函数的是key,函数返回值就是删除元素的数量(如果是key不能重复的容器,如map,那么返回值不是1就是0,如果容器中原本有此key,就返回1;如果没有,返回的就是0;但像multimap这样key可以重复的容器,返回值可能会大于1)

如果传递给函数的是迭代器,返回的就是删除后在原先顺序下的位置的新的迭代器

3.map的下标操作

set类型不支持下标操作,因为其元素本身就是关键字;

multimap等也不支持,因为一个key可能对应多个value;

下标操作是通过key来访问value,格式:

m["guk"]  ;

m[23] = "haha";

返回值类型:

map下标操作返回的就是key对应的那个value的类型

而解引用map迭代器(上面6.有关迭代器有详细说明)得到的是一个pair<,>

find与count

key重复容器怎么办?如下:

(C++Primer P390页还有另外两种方法)

9.map的有关函数总结

begin()返回指向map头部的迭代器
clear()删除所有元素
count()返回指定元素出现的次数
empty()如果map为空则返回true
end()返回指向map末尾的迭代器
equal_range()返回特殊条目的迭代器对
erase()删除一个元素
find()查找一个元素
get_allocator()返回map的配置器
insert()插入元素
key_comp()返回比较元素key的函数
lower_bound()返回键值>=给定元素的第一个位置
max_size()返回可以容纳的最大元素个数
rbegin()返回一个指向map尾部的逆向迭代器
rend()返回一个指向map头部的逆向迭代器
size()返回map中元素的个数
swap()交换两个map
upper_bound()返回键值>给定元素的第一个位置
value_comp()返回比较元素value的函数

(函数总结摘自cppreference.com

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: STL中的map是一个非常有用的容器,它提供了一种关联数组的方式,可以将任意类型的数据关联起来。map底层使用红黑树实现,因此查找和插入操作的时间复杂度为O(logn)。 在使用map时,需要定义一个键和值的类型。键必须是可比较的类型,并且支持小于操作符。例如可以使用字符串作为键,而值可以是任意类型的数据。通过[]操作符可以访问每个键-值对,也可以使用迭代器遍历map中的所有数据。 map还提供了许多其他的方法,包括插入、查找、删除、遍历、清空等。此外,map还具有自动排序的功能,键-值对按照键的大小自动排序。当需要按照键进行排序时,使用map将非常方便。 总的来说,STL中的map可以提供一种快速、方便、可靠的方法将数据关联起来,特别适合对数据进行查找和排序。借助于map的丰富功能,能够提高程序的效率和性能。 ### 回答2: STL map 是 C++ STL 中的一种容器,它是一个关联容器,它以键对值的方式存储数据。STL map 中的元素是按照其键的大小排列的,通常使用红黑树这样的自平衡二叉搜索树来实现其底层存储结构。因此,它支持快速插入、删除和查找操作。 STL map 中的键和值都可以是任何可比较的类型,如整数、浮点数、字符串、对象等。在 map 中,键是唯一的,每个键只能对应一个值。如果插入相同的键,则会替换已有键对应的值。 STL map 的基本操作有插入、删除和查找操作。插入操作可以使用 insert() 函数或者中括号符[],例如: ```c++ #include <map> #include <iostream> using namespace std; int main() { map<string, int> scores; // 方式一:使用 insert() scores.insert(make_pair("Tom", 90)); // 方式二:使用中括号符[] scores["Jerry"] = 80; // 输出 scores 中的所有元素 for (map<string, int>::iterator it = scores.begin(); it != scores.end(); ++it) { cout << it->first << ": " << it->second << endl; } return 0; } ``` 删除操作可以使用 erase() 函数,例如: ```c++ scores.erase("Tom"); ``` 查找操作可以使用 find() 函数,例如: ```c++ map<string, int>::iterator it = scores.find("Jerry"); if (it != scores.end()) { cout << "Jerry's score is " << it->second << endl; } else { cout << "Jerry is not in the scores map" << endl; } ``` 此外,还有其他常用操作,如:判断 map 是否为空、获取 map 的大小等。STL map 还支持迭代器等高级操作。 综上所述,STL map 是一种很常用的 C++ STL 容器,它提供了一种便捷的存储和管理键值对的方法,可以快速实现查找、添加、删除等操作。对于大多数场景,STL map 都是一个非常不错的选择。 ### 回答3: STL Map是C++中非常重要的一个容器。map本质上是一颗红黑树,可以自动排序,支持基于关键字的快速查找。其中关键字和值可以是任何可比较类型。 由于它是一颗红黑树,因此每个元素在树中的位置是由关键字决定的。这个特性使得查找、操作和插入元素都非常高效。此外,map还支持基于关键字的范围查找和删除。 使用map时需要注意,操作map时会产生额外的开销,因此在大量操作时,可能需要考虑使用其他容器。 另外,map的实现具有高度的迭代器稳定性,这意味着一旦某个元素被插入或删除,对其他元素的迭代器不会受到影响。这也使得map非常适合在需要基于关键字进行高效访问的情况下维护数据。 总之,STL Map是C++标准库提供的一个非常方便的容器,可以快速实现基于关键字的查找和排序。在实际应用中,需要根据具体场景选择合适的容器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值