C++ map、set用法总结

C++容器之map、set 

C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库,容器往往包含同一类型的数据,STL中比较常用的容器是vector,set,和map,比较常用的算法有 Sort 等。今天就来介绍一下map和set。 

目录

map(映射):

特性

 基本构造函数(声明方式)

插入(共三种)

大小

查找(判断关键字是否在map中出现)

删除

判空(判定map是否为空)和 清空(将map清空)

交换

 set(集合)

定义

基本操作


map(映射):

map是STL的一个关联容器,他提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为该关键字的值)的数据处理能力。

特性

所有元素都会根据元素的减值自动被排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素会被视为键值,第二个元素会被视为实值。map不允许两个元素拥有相同的键值

由该特性:map内部的实现自建一棵红黑树(一种严格意义上的平衡二叉树),这棵树具有对数据自动排序的功能。

举例说明什么是一对一的数据映射:比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型用map可以轻易描述。很明显学号用int描述,姓名用字符串描述(本篇中不用char*来描述字符串,而是采用STL中的string来描述)。
 

先来两张图理解一下吧:

必须要加头文件 #include<map>

 基本构造函数(声明方式)

map<string,int>strMap;

map<int,string>intMap;

map<string,char>strMap;

map<char,string>charMap;

map<char,int>charMap;

map<int,char>intMap;

插入(共三种)

用数组方式插入数据

map<int,string>m;

 // m[1]="student_one";

 用insert函数插入pair数据

 

 用insert函数插入value_type数据

 

 以上三种方法,虽然都可以实现数据的插入,但是它们是有区别的,当然第二种和第三种在效果上是完全一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字的时候,insert函数是不能再插入这个数据的,但是使用数组的方式就不同了,它可以覆盖以前该关键字对应的值。

我们可以用代码来具体看一下它们的区别:(为了效果明显,举的例子就少了一些啦哈)

我们可以看到“小狗同志"并没有被插入进去,这是因为它的键值与上面的"小猪同志"重复了,都是2。 

我们可以看到,“小狗同志”将上面的与其键值相同的“小猪同志”给覆盖了,也就是给替换了。 

大小

 size();

 

查找(判断关键字是否在map中出现)

 用cout函数

//若出现过就返回1,否则返回0

 

用count函数虽然可以判断关键字是否出现,但是无法定位数据出现的位置 。

删除

erase(); 

判空(判定map是否为空)和 清空(将map清空)

empty();  //判空

clear();  //清空

 

交换

swap(); 

 

 set(集合)

set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就像一个集合一样,所有的操作都是严格在logn时间之内完成的,效率非常高,set插入的元素不能相同。

与vector的区别;set中不会包含重复的元素

定义

set<类型>标识符 

//如set<int>a;   定义一个元素为整数的集合a

基本操作

clear();  //清空所有元素

count();  //返回某个值元素的个数

empty();  //判断集合是否为空

erase();  //删除集合中的元素

insert();  //在集合中插入元素

size();  //集合中元素的数目

max_size();  //返回集合能容纳的元素的最大限值

swap();  //交换两个集合变量

这些函数我们在学string,以及上面所说的map等容器中都有示例,用法基本上都是相同的,具体的可以去看之前的。

把这些函数的代码都给敲一下:

#include<iostream>
#include<string.h>
#include<set>
using namespace std;
int main()
{ 
    //定义 
	set<int>a;
	//插入新元素
	a.insert(0);
	a.insert(1);
	a.insert(2);
	a.insert(1); 
	//输出集合中元素数目
	cout<<"集合中元素的数目:"<<a.size()<<endl; //由于set中不包含重复的元素,所以元素个数为3 
	//输出集合能容纳元素的最大限值
	cout<<a.max_size()<<endl;//是一个很大的数 
	//输出某个元素的个数
	cout<<"元素1的个数:"<<a.count(1)<<endl;//由于set中不包含重复的元素,所以1的个数为一个 
	//删除元素
	int n=a.erase(0); 
	if(n==1)//如果删除成功,则返回1,n就等于1 
	cout<<"元素0删除成功"<<endl;
	else 
	cout<<"元素0删除失败"<<endl;
	//交换
	set<int>s;
	s.insert(10);
	a.swap(s);
	cout<<"交换后集合a中的元素个数:"<<a.size()<<endl;//交换过后集合a中的元素个数为1 
	//判断是否为空
	cout<<a.empty()<<endl;//不为空输出0 
	//清空集合a
	a.clear();
	cout<<a.empty()<<endl;//为空输出1 
	return 0;
}

运行结果:

其中最主要的就是集合中元素的数目size和元素1的数目count,因为集合set的特性,虽然插入了4个元素,但是因为有两个元素是重复的,所以集合中还是只有3个元素,重复的元素1也只有一个。 

发布了23 篇原创文章 · 获赞 30 · 访问量 8679

猜你喜欢

转载自blog.csdn.net/l218623/article/details/104151321