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