【STL】C++标准模板库——Map

01、文章目录

02、浅谈Map容器

map是STL的一个关联容器,它提供一对一的hash。

第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);

map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
比如我们的身份证号:每个号码对应一个名字,号码就是key、名字就是值。值可以重复,但是号码不会,在公民数据库里面就是这么保存的。

map的功能非常强大:自动建立key - value的对应。key 和 value可以是任意你需要的类型。
使用须知:由于map是标准模板库,他被嵌在了很多编译器里面(这里用Visual Studio举例),我们要使用map容器,只需要包含头文件#include <map>即可。
map构成:map对象是模板类,需要关键字和存储对象两个模板参数:std:map<int, CString> M1;
这样就定义了一个用int作为索引,并拥有相关联的指向CString的指针.(CString是MFC中的类型),一般来说,在MFC中使用STL容器都需要加上命名空间,不然会报错(加头文件的前提下)。

03、Map成员方法表

方法(Function)描述(Descriptation)
begin()返回指向map头部的迭代器
end()返回指向map末尾的迭代器
clear()删除所有元素
count()返回指定元素出现的次数
empty()如果map为空则返回true
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的函数

04、成员方法演示示例

PS:下面所有示例,只展示核心代码,并非完整代码,望悉知!

  1. insert
/* insert 方法*/
1、pair
2、make_pair
3、value_type
4、数组插入法

//上述四种方法,下面举例,后面所有插入操作都用此处的例子数据
//前三种方法当出现重复键时,编译器会报错,而第四种方法,当键重复时,会覆盖掉之前的键值对。
/*
*第一种 数组插入法
*/
map<int,char> M;
M[1] = 'A';
M[2] = 'B';
M[3] = 'C';
M[4] = 'D';

/*
*第二种 pair,数据插入一个,举一反三即可
*/
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
//下面操作仅仅只是判断是否插入成功,可有可无,如没有,插入失败程序会崩溃
if(pair.second == true)
{
	cout << "数据插入成功!" << endl;
} else {
	cout << "数据插入失败!" << endl;
}

/*
*第三种 make_pair,同上
*/
map<int,char> M;
M.insert(make_pair<int,char>(1,'A'));


/*
*第四种 value_type,同上
*/

map<int,char> M;
M.insert(map<int,char>::value_type(1,'A'));
  1. begin()/end()
map<int,char> M;
M[1] = 'A';
M[2] = 'B';
M[3] = 'C';
M[4] = 'D';

map<int,char>::iterator bt = M.begin();
map<int,char>::iterator et = M.end();

for(bt,bt != et,bt++)
{//遍历整个map集合,得到所有value
	cout << bt->second << endl;
}
  1. count()
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

cout << M.count(1) << endl; //返回键值为1的元素出现的个数
  1. clear()
map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

cout << "执行clear()前:" << endl;
for(map<int,char>::iterator it = M.begin(),it != M.end(), it++)
{
	cout << it->second;
}

M.clear();
cout << endl;
cout << "执行clear()后:" << endl;

for(map<int,char>::iterator it = M.begin(),it != M.end(), it++)
{
	cout << it->second;  //此时为NULL
}

  1. empty()
map<int,char> M;
M[1] = 'A';
M[2] = 'B';
M[3] = 'C';
M[4] = 'D';

bool m_bCheakNull = M.empty();
if(m_bCheakNull)
{
	cout << "map 为NULL!" << endl;
}

M.clear();

m_bCheakNull = M.empty();
if(!m_bCheakNull)
{
	cout << "map 不为NULL!" << endl;
}
  1. erase()
/*
void erase( iterator pos );  //删除指定位置的元素
void erase( iterator start, iterator end );  //删除start迭代器与end迭代器之间的所有元素
size_type erase( const KEY_TYPE &key ); //删除所有键为key的元素,并返回删除的个数
*/

map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

for(map<int,char>::iterator it = M.begin(); it != M.end();i++)
{
	cout << it->second << endl;
}

M.erase(M.begin()); //B,C,D

M.erase(M.being(),M.end());  //删除全部,为NULL

M.erase(1);  //删除键为1的所有元素,并返回其删除的个数

  1. find()
    find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
//iterator find( const KEY_TYPE &key );

map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

map<int,char>::iterator CurIt = M.find(3);
//此处给到了一种得到当前迭代器的方法,知道当前的键的情况下
  1. max_size()
    max_size()函数返回map能够保存的最大元素个数。
//size_type max_size();

map<int,char> M;
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

int nNum = M.max_size();

cout << "map容器容量最大为:" << nNum << endl;  //178956970
  1. size()
    size()函数返回map中保存的元素个数。
//size_type size();

pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

int Num = M.size();

cout << "当前map的个数为: " << Num << endl;

  1. swap()
    swap()交换obj和现map中的元素。
//void swap( map& obj );
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(1,'A'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(2,'B'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(3,'C'));
pair<map<int,char>::iterator, bool> pair = M.insert(pair<int,char>(4,'D'));

for(map<int,char>::iterator it = obj.begin(); it != obj.end(); it++)
{
	cout << it->second << endl;
}

//swap作为谓词使用,TODO

for(map<int,char>::iterator it = obj.begin(); it != obj.end(); it++)
{
	cout << it->second << endl;  //顺序和上面颠倒
}

05、小结

关于Map容器我主要写了几个常用的例子,其余的,比如配置器、逆方向这里不多提,基本一样,大家可以动手试试。

要是有错误的地方欢迎大家指出,谢谢!

版权声明:转载请注明出处,谢谢!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cain Xcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值