c++STL标准类模板库(关联式容器(map、multimap类模板),这两种容器的赋值方式不同于其他)

该篇博客承接上一篇博客中的关联式容器(set、multiset)两者有相同之处,也有不同之处,其map、multimap类型中的元素的数据和关键值是分开的,而set、multiset类型中元素的数据和关键值是一个位置,即存储的数据又被称为数据的关键词。

map容器

创建一个map类模板的语法格式入下:

std::map<key,type,predicate> name;

这种方法创建了一个名为name,并且包含type类型数据的map空对象。该对象使用谓词所指定的函数来对集合中的元素进行排序。例如,要给整数创建一个空map对象,可以这样写:

std::map<int,int,std::less<int>> intmap;

 map<key,type,predicate> name(mymap);

//这种方法使用了复制构造函数,从一个已存在的映射mymap中生成一个map对象。

map<key,type,predicate> name(first,last);

//这种方式从一定范围的元素中根据多重指示器所指示的起始与终止位置创建一个映射。

map 类模板中的方法说明如表:


函数 说明
begin 返回指向集合中的第一个元素的迭代器
end 返回指向集合中的最后一个元素的迭代器
clear 删除集合中所有的元素
empty 判断集合是否为空,若为空返回true
equal_range(x) 返回表示x下界和上界的两个迭代器,下界表示集合中第一个值等于x的元素,上界表示第一个值大于x的元素
erase(i) 删除由迭代器所指的集合元素,或通过键值删除所集合元素
erase(x) 删除集合中值为x的元素
find(x) 返回一个指向x的迭代器,如果x不存在,返回的迭代器等于end
lower_bound(x) 返回一个迭代器,指向位于x之前且紧邻x的元素
max_size 返回集合的最大容器
rbegin 返回一个反向迭代器,指向集合最后一个元素
rend 返回一个反向迭代器,指向集合第一个元素
size 返回集合的大小
swap() 交换两个集合的内容
upper_bound(x) 返回一个指向x的容器
value_comp 返回value_compare类型的对象,该对象用于判断集合中元素的先后顺序

例如,创建一个map对象,使用插入的方式添加新元素:

#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<int,char> imap;    //创建map映射对象
	imap.insert(map<int,char>::value_type(1,'c'));    //插入新元素(与之前的插入有所不同)
	imap.insert(map<int,char>::value_type(4,'a'));
	imap.insert(map<int,char>::value_type(3,'d'));
	imap.insert(map<int,char>::value_type(15,'f'));
	map<int,char>::iterator it;
	for(it=imap.begin();it!=imap.end();it++)        //循环map映射显示元素值
	{    
		cout<<(*it).first<<"->";
		cout<<(*it).second<<endl;
	}
	return 0;	
} 

 运行结果如下:

由运行结果可以看出,该容器是利用前一个检索码来排序的而非是数据本身,并且此类模板的插入以及遍历输出都跟前面的模板不太一样,利用了it.first表示第一个检索码,it.second表示第二个数据 ,再插入是用了imap.insert(map<int,char>::value_type());不同的是用了value_type这一个数据。

注意这两个类模板存储字符串数据与其他的类模板操作不一样,具体操作如下:

#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<double,string> mm;
	mm.insert(pair<double,string>(5.24,string("李牧歌")));    //用pair的格式插入数据
	mm.insert(make_pair(3.21,string("侯伊美")));        //使用make_pair存储数据
	mm.insert(make_pair(10.9,string("王润怡")));
	mm.insert(make_pair(9.21,string("王俐元")));
	map<double,string>::iterator it=mm.begin();
	cout<<"mm:"<<endl;
	while(it!=mm.end())
	{
		cout<<"生日"<<it->first<<endl;
		cout<<"姓名"<<it->second<<endl;
		cout<<endl; 
		*it++;	
	}	
	return 0;	
} 

具体运行结果如下(给年龄大小也进行了排序):

 具体其中利用到了两种格式进行字符串数据的插入,make_pair和pair两种方式,本人觉得第一种方式操作起来更加方便。还可以直接利用数组的方式赋值mm[1.5]=string("hym);特别注意这里的赋值与其他类模板的赋值方式有所不同所以需要大家特别注意。

multimap容器


        multimap能够顺序存储一组值,它与map相同的是每一个元素都可以包含一个关键值以及与之联系的数据项,与map不同的是多重映射可以包含重复的数据,但是它不可以使用【】操作符向多重元素中赋值。

构造multimap类模板的语句如下:

std::multimap<key,type,predicate> name;

        这种方式创造了一个名为name,并且包含type类型数据类型的multimap空对象。该对象使用谓词所指定的函数来对集合中的元素进行排序。例如,要给整数创建一个空multimap对象可以这样写:

std::multimap<int,int,std::less<int> > intmap;
//注意《int》后需要敲一个空格

multimap<key,type,predicate> name(mymap);

//这种方法使用了复制构造函数,从一个已存在的映射mymap中生成一个multimap对象。

multimap<key,type,predicate> name(first,last);

//这种方式从一定范围的元素中根据多重指示器所指示的起始与终止位置创建一个映射。

它与map类模板最大的区别就在于不可以使用【】对集合中的元素进行赋值操作,同时它的数据项可以重复出现,如下代码:

#include<iostream>
#include<map>
using namespace std;
int main()
{
	multimap<double,char> Cmap;
	Cmap.insert(make_pair(1,'c'));
	Cmap.insert(make_pair(4,'c'));
	Cmap.insert(make_pair(2,'b'));
	Cmap.insert(make_pair(6,'r'));
	Cmap.insert(make_pair(13,'a'));
	cout<<"Cmap :"<<endl;
	map<double,char>::iterator it=Cmap.begin();
	while(it!=Cmap.end())
	{
		cout<<" "<<it->first;
		cout<<" "<<it->second<<endl;
		cout<<endl; 
		*it++;	
	}	
	return 0;	
} 

也可以用pair的方式对其进行赋值操作,还可以用map<int,cahr>::value_type()进行赋值操作,如果大家还有什么方便简易的赋值操作希望可以分享在评论区,对此multimap类模板里的使用方式与map类模板的使用方式一模一样没有什么变动,所以这里就不加入它的使用方式的图表了,只需要区分它与map类模板的差别在哪里就可以了。

        这篇博客就到这里结束了,本身承诺是周三更新博客的但是周三确实事情有些多参与了一些学校的活动和比赛,所以周三那天非常繁忙就没有更新博客了,今天课程稍微少一点就把这篇博客写完更新掉,希望各位看来这几篇对STL标准模板库的博客,可以对STL标准模板库有一定的认识以及有兴趣的可以下去自己思考敲一敲代码,动脑子不如动手去做。下一篇博客就该讲述STL模板库中较为重要的一个模块算法,可以关注一下看看后续的内容(反正这次我是不会再承诺更新博客的时间了,随心更新开心最重要啦)每更新一篇博客我都可以学到一些自己之前没有发现的小知识点,可能是我自己学习的时候没有很细哈哈哈,所以我们一定要常动手去实践不要想象,程序可能运行出来后跟你想象的完全不一样哦。

猜你喜欢

转载自blog.csdn.net/m0_61886762/article/details/124158923