STL中的容器:
map容器 multimap容器 常用接口及用法:
map
/ multimap
容器:map
容器和 multimap
容器也是关联式容器,底层的结构是用二叉树(红黑树)实现的;
map
和 multimap
容器是使用频率仅次于 vector
容器和 list
容器的一种容器;STL
所说的高性能、高效率指的就是这个容器;
map
和 multimap
容器简介:
1.map
中的所有元素都是 pair
对组;
2.pair
对组中的第一个元素为 key
(键值),它是用来起索引作用的;pair
对组中的第二个元素为 value
,它也被称为实值;
(map
容器的高性能、高效率就体现在它的键值上。由于键值的索引作用,我们可以快速、准确地找到容器中键值所对应的元素)
例如:中国有14亿人口,人口数量巨大,但其实每个人都有唯一的一个身份证号,因此我们可以通过身份证号在茫茫人海中精准地索引到一个人,而这个身份证号就可以称为键值(key
),我们这个人自身就可以称为实值(value
)。
3.所有的元素插入的时候会根据键值自动排序;
map
和 multimap
容器的区别:
1.map
容器不允许插入相同的 key
元素的数据;
2.multimap
容器允许插入相同的 key
元素的数据;
各种函数接口具体如何使用,下面的代码块中会有详细的使用方法
map
和 multimap
容器的构造函数和赋值:
map
和 multimap
容器的构造函数:
1.map<T1,T2> mp;
默认(无参)构造函数
2.map(const map & mp);
拷贝构造函数
map
和 multimap
容器的赋值:
1.map& operator=(const map & mp);
通过重载赋值运算符的方式给新创建的 map
容器赋值;
#include <iostream>
#include <map> //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printMap(const map<int,string> & m)
{
for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
cout << endl;
}
void test_1() //map容器的构造函数
{
map<int,string> m1; //默认(无参)构造函数
//将对组插入到map容器
m1.insert(pair<int,string>(1,"Yauge_1")); //这里是创建了一个匿名的对组,并把这个对组插入到map容器中
m1.insert(pair<int,string>(3,"Yauge_3"));
m1.insert(pair<int,string>(2,"Yauge_2"));
m1.insert(pair<int,string>(5,"Yauge_5"));
m1.insert(pair<int,string>(4,"Yauge_4"));
//遍历输出打印
printMap(m1);
map<int,string> m2(m1); //拷贝构造函数
printMap(m2);
}
void test_2() //map容器的赋值
{
map<int,string> m1;
//将对组插入到map容器
m1.insert(pair<int,string>(1,"Yauge_1")); //这里是创建了一个匿名的对组,并把这个对组插入到map容器中
m1.insert(pair<int,string>(3,"Yauge_3"));
m1.insert(pair<int,string>(2,"Yauge_2"));
m1.insert(pair<int,string>(5,"Yauge_5"));
m1.insert(pair<int,string>(4,"Yauge_4"));
//遍历输出打印
printMap(m1);
map<int,string> m2;
m2 = m1;
printMap(m2);
}
int main()
{
test_1();
test_2();
system("pause");
return 0;
}
map
和 multimap
容器的大小和交换:
map
和 multimap
容器的大小:
1.empty();
判断 map
容器是否为空;
2.size();
用于查看容器的大小(元素个数);
map
和 multimap
容器的交换:
1.swap(mp);
将容器 mp
与本身的 map
容器进行交换;
#include <iostream>
#include <map> //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printMap(const map<int,string> & m)
{
for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
cout << endl;
}
void test_1() //map容器的大小
{
map<int,string> m1; //默认(无参)构造函数
//将对组插入到map容器
m1.insert(pair<int,string>(1,"Yauge_1")); //这里是创建了一个匿名对组,并把这个对组插入到map容器中
m1.insert(pair<int,string>(3,"Yauge_3"));
m1.insert(pair<int,string>(2,"Yauge_2"));
m1.insert(pair<int,string>(5,"Yauge_5"));
m1.insert(pair<int,string>(4,"Yauge_4"));
//遍历输出打印
printMap(m1);
if(m1.empty()) //判断当前容器是否为空,如果容器为空,则返回true,否则返回false
{
cout << "m1容器为空" << endl;
}
else
{
cout << "m1容器不为空" << endl;
cout << "m1容器的大小为:" << m1.size() << endl; //用于查看容器的大小(元素个数)
}
}
void test_2() //map容器的交换
{
map<int,string> m1; //map容器m1
//将对组插入到m1中
m1.insert(pair<int,string>(1,"Yauge_1"));
m1.insert(pair<int,string>(3,"Yauge_3"));
m1.insert(pair<int,string>(2,"Yauge_2"));
map<int,string> m2; //map容器m2
//将对组插入到m2中
m2.insert(pair<int,string>(5,"Yauge_5"));
m2.insert(pair<int,string>(4,"Yauge_4"));
m2.insert(pair<int,string>(6,"Yauge_6"));
cout << "交换前:" << endl;
printMap(m1);
printMap(m2);
cout << "—————————————————————" << endl;
m1.swap(m2); //将m1和m2交换
cout << "交换后:" << endl;
printMap(m1);
printMap(m2);
}
int main()
{
test_1();
test_2();
system("pause");
return 0;
}
map
和 multimap
容器的插入和删除:
1.insert(elem);
在 map
容器中插入 elem
元素;
2.erase(key);
删除 map
容器中与键值 key
匹配的元素;
4.erase(pos);
通过迭代器删除掉 map
容器指定位置的数据;
5.erase(begin,end);
通过迭代器删除掉 map
容器区间 [begin,end)
之间的数据;
6.clear();
清空当前的 map
容器;
#include <iostream>
#include <map> //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printMap(const map<int,string> & m)
{
for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
cout << endl;
}
void test_1() //map容器的插入
{
map<int,string> m1;
//map容器的插入(四种插入方式)
m1.insert(pair<int,string>(1,"Yauge_1")); //第一种插入方式
m1.insert(make_pair(2,"Yauge_2")); //第二种插入方式
m1.insert(map<int,string>::value_type(3,"Yauge_3")); //第三种插入方式(不推荐使用,因为它太长了,也不好理解)
m1[4] = "Yauge_4"; //第四种插入方式(不推荐使用,这种重载[]的方式更适合用来索引,前提是这个元素确实存在于容器中,否则容器会自动创建你要找的元素,只不过实值(value)被赋值为0)
printMap(m1);
}
void test_2() //map容器的删除
{
map<int,string> m1;
m1.insert(make_pair(1,"Yauge_1"));
m1.insert(make_pair(2,"Yauge_2"));
m1.insert(make_pair(3,"Yauge_3"));
m1.insert(make_pair(4,"Yauge_4"));
m1.insert(make_pair(5,"Yauge_5"));
printMap(m1);
m1.erase(m1.begin()); //通过迭代器删除掉map容器指定位置的数据
printMap(m1);
m1.erase(3); //删除map容器中与键值key匹配的元素
printMap(m1);
m1.erase(m1.begin(),m1.end()); //通过迭代器删除掉map容器区间[m1.begin(),m1.end())之间的数据
printMap(m1);
m1.clear(); //清空当前的map容器
printMap(m1);
}
int main()
{
test_1();
test_2();
system("pause");
return 0;
}
map
容器的查找和统计:
map
容器的查找:
1.find(key);
在 map
容器中查找键值为 key
的元素是否存在,若存在,返回该元素的迭代器;若不存在,返回 map.end()
;
键值为 key
的元素不存在,返回 map.end()
,可以理解成找到了 map
容器的最后一个元素都没有找到键值为 key
的元素,因此返回的是 map
容器的末尾位置的迭代器;
map
容器的统计:
1.count(key);
在 map
容器中统计键值为 key
的元素出现的次数,返回值即为键值为 key
的元素出现的次数;
对于 map
容器,只可能返回 0
或者 1
;对于 multimap
容器,返回值可以大于 1
;
因为 map
容器中键值为 key
的元素不可以重复,但 multimap
容器中键值为 key
的元素是允许重复的。也就是说,在 map
容器中,键值为 key
的元素最多出现一次,所以 map
容器只能返回 0
或者 1
;
#include <iostream>
#include <map> //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printMap(const map<int,string> & m)
{
for(map<int,string>::const_iterator it=m.begin();it!=m.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
cout << endl;
}
void printMultimap(const multimap<int,string> & m)
{
for(multimap<int,string>::const_iterator it=m.begin();it!=m.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
cout << endl;
}
void test_1() //map容器的查找
{
map<int,string> m1;
m1.insert(make_pair(1,"Yauge_1"));
m1.insert(make_pair(2,"Yauge_2"));
m1.insert(make_pair(3,"Yauge_3"));
m1.insert(make_pair(4,"Yauge_4"));
m1.insert(make_pair(5,"Yauge_5"));
printMap(m1);
map<int,string>:: iterator pos = m1.find(3); //用迭代器接收find()函数的返回值
if(pos==m1.end())
{
cout << "没有找到目标键值所对应的元素" << endl;
}
else
{
cout << "找到目标键值所对应的元素" << endl;
cout << "key(键值):" << (*pos).first << " value(实值):" << (*pos).second << endl;
}
}
void test_2() //map和multimap容器的统计
{
map<int,string> m1; //map容器m1
m1.insert(make_pair(1,"Yauge_1"));
m1.insert(make_pair(3,"Yauge_3"));
m1.insert(make_pair(2,"Yauge_2"));
m1.insert(make_pair(3,"Yauge_33"));
m1.insert(make_pair(4,"Yauge_4"));
m1.insert(make_pair(5,"Yauge_5"));
m1.insert(make_pair(3,"Yauge_333"));
printMap(m1);
int num_1 = m1.count(3); //num_1为键值为3的元素在map容器中出现的次数
cout << "目标键值所对应的元素出现的次数为:" << num_1 << endl;
cout << "——————————————————————" << endl;
multimap<int,string> m2; //multimap容器m2
m2.insert(make_pair(1,"Yauge_1"));
m2.insert(make_pair(3,"Yauge_3"));
m2.insert(make_pair(2,"Yauge_2"));
m2.insert(make_pair(3,"Yauge_33"));
m2.insert(make_pair(4,"Yauge_4"));
m2.insert(make_pair(5,"Yauge_5"));
m2.insert(make_pair(3,"Yauge_333"));
printMultimap(m2);
int num_2 = m2.count(3); //num_2为键值为3的元素在multimap容器中出现的次数
cout << "目标键值所对应的元素出现的次数为:" << num_2 << endl;
}
int main()
{
test_1();
test_2();
system("pause");
return 0;
}
map
容器指定排序规则:
利用仿函数(重载 ()
运算符)的技术,修改 map
容器的排序规则(map
容器默认排序规则为从小到大,我们人为修改为从大到小);
但因为 map
容器在插入时会自动的做排序,所以要修改默认排序规则的话,应该要在插入操作前修改排序规则;
在使用到 map
和 multimap
容器存放自定义数据类型时,需要提前指定好排序规则,否则编译器不知道怎么将我们的自定义数据插入到 map
和 multimap
容器中;(因为 map
和 multimap
容器在插入数据时会自动的做排序操作)
需要注意的是,map
容器与 set
容器不同,map
容器是对键值进行排序,set
容器是对插入的数据进行排序;
#include <iostream>
#include <map> //使用STL中的容器,得包含它的头文件,map和multimap容器的头文件是一样的,都是map
#include <string>
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
class MyCompare
{
public:
bool operator()(int v1,int v2) //利用仿函数(重载()运算符)的技术,修改map容器的排序规则
{
//排序规则指定为从大到小排
return v1 > v2;
}
};
void test_1() //map容器指定排序规则
{
map<int,string> m1;
m1.insert(make_pair(2,"Yauge_2"));
m1.insert(make_pair(1,"Yauge_1"));
m1.insert(make_pair(3,"Yauge_3"));
m1.insert(make_pair(5,"Yauge_5"));
m1.insert(make_pair(4,"Yauge_4"));
cout << "排序规则修改前:" << endl;
//遍历输出打印
for(map<int,string>::const_iterator it=m1.begin();it!=m1.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
cout << "——————————————————————" << endl;
}
void test_2() //map容器指定排序规则
{
map<int,string,MyCompare> m1;
m1.insert(make_pair(2,"Yauge_2"));
m1.insert(make_pair(1,"Yauge_1"));
m1.insert(make_pair(3,"Yauge_3"));
m1.insert(make_pair(5,"Yauge_5"));
m1.insert(make_pair(4,"Yauge_4"));
cout << "排序规则修改后:" << endl;
//遍历输出打印
for(map<int,string,MyCompare>::const_iterator it=m1.begin();it!=m1.end();it++)
{
cout << "key(键值):" << (*it).first << " value(实值):" << it->second << endl;
}
}
int main()
{
test_1();
test_2();
system("pause");
return 0;
}
以上就是STL中map容器和multimap容器的一些常用接口和用法啦O(∩_∩)O。笔记中有错误的地方,欢迎指出,欢迎大家讨论!