一、map的特点
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。
对于迭代器来说,可以修改实值,而不能修改key。
二、map的用法
1.map的定义及初始化
(1)map的定义
-
map< T,T> data;
map<string , int >mapstring; map<int ,string >mapint; map<sring, char>mapstring; map< char ,string>mapchar; map<char ,int>mapchar; map<int ,char >mapint;
(2) 初始化
map<int, string> Name = {
{ 2015, “Jim” },
{ 2016, “Tom” },
{ 2017, “Bob” } };
Name[2015] = “Tom”;
2.map的状态
- bool empty(); // 查询map是否为空
- size_t size();// 查询map中键值对的数量
- size_t max_size();// 查询map所能包含的最大键值对数量,和系统和应用库有关。
// 此外,这并不意味着用户一定可以存这么多,很可能还没达到就已经开辟内存失败了 - size_t count( const Key& key ) const; // 查询关键字为key的元素的个数,在map里结果非0即1
3.map的操作
(1)迭代器操作
- begin() 返回指向第一个元素的迭代器
- end() 返回末尾的迭代器
- rbegin() 返回指向第一个元素的逆向迭代器
- rend() 指向list末尾的逆向迭代器
- cbegin
- cend
- crbegin
- crend
前四个和后四个的区别在于,后者一定返回 const_iterator,而前者则根据map的类型返回iterator 或者 const_iterator。const情况下,不允许对值进行修改。如下面代码所示
(2)插入操作
- 用insert函数插入value_type数据
- 用insert函数插入pair数据
- 数组的方式
- 用insert函数插入{}数组
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> data={
{1,"a"},
{2,"b"}
};
data[3]='c';
map<int,string>::iterator it;
data.insert(pair<int,string>(4,"d"));
data.insert(map<int,string>::value_type(-1,"z"));
data.insert({{10,"4"}});//可以多个插入
for(it=data.begin();it!=data.end();it++)
{
cout<<it->first<<' '<<it->second<<endl;
}
}
以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的 插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是插入数据不了的,但是用数组方式就不同了,它可以覆盖以前该关键字对 应的值,用程序说明
(3)删除操作
-
iterator erase(iterator it);//通过一个条目对象删除
-
iterator erase(iterator first,iterator last)//删除一个范围
-
size_type erase(const Key&key);//通过关键字删除
-
clear() //就相当于enumMap.erase(enumMap.begin(),enumMap.end());
(2)查找操作
-
用count函数来判定关键字是否出现,其缺点是无法定位数据出现位置,由于map的特性,一对一的映射关系,就决定了count函数的返回值只有两个,要么是0,要么是1,出现的情况,当然是返回1了
-
iterator find (const key_type& k);
const_iterator find (const key_type& k) const;
// 关键字查询,找到则返回指向该关键字的迭代器,否则返回指向end的迭代器
// 根据map的类型,返回的迭代器为 iterator 或者 const_iterator用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据 所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返 回的迭代器。查找map中是否包含某个关键字条目用find()方法,传入的参数是要查 找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个 条目和最后一个条目,这两个数据的类型是iterator.
-
这个方法用来判定数据是否出现,是显得笨了点,但是,我打算在这里讲解
lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<int,string> data={
{1,"a"},
{2,"b"}
};
data[3]='c';
map<int,string>::iterator it;
data.insert(pair<int,string>(4,"d"));
it=data.find(1);//查找关键字1,结果为find,==a
if(it!=data.end())
{
cout << "find,=="<<it->second<<endl;
}
else
{
cout << "don't find"<<endl;
}
cout<<data.count(2);//查找关键字2,结果为1
}
operator: == != < <= > >=
注意 对于==运算符, 只有键值对以及顺序完全相等才算成立。
转载:https://blog.csdn.net/happen_if/article/details/100167963