C++容器概述
C++STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
STL六大组件的交互关系:
1、容器通过空间配置器取得数据存储空间
2、算法通过迭代器存储空间的内容
3、仿函数可以协助算法完成不同策略的变化
4、适配器可以修饰仿函数
容器:就是各种数据结构,如vector、list、deque、set、map等,用于存放数据,从实现的角度来看,STL容器是一种模板类。
1、顺序容器
定义: 在容器内部,元素的摆放是有顺序的。
2、关联容器
定义: 关联容器不计较顺序的概念,使用关键字来访问元素。
标准的STL关联容器分为set(集合)和map(映射)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表)。这些容器的底层机制均以RB-tree完成(红黑树)。
①map操作
map只允许产生一对一的关系,也就是一个关键字对应一个值,就如生活中大多数人,一人一套房。但是也有人是名下多套房,这就可以使用multimap,它允许一个关键字对应多个值。
a.添加
不允许key有重复的
address_map.insert({"张三" , "星湖花园1号"});
address_map.insert(make_pair("李四" , "星湖花园1号"));
address_map.insert(pair<string ,string>("王五" , "星湖花园1号"));
b.访问
map可以使用[ ]的方式来获取指定的元素,要求传递进来的是key关键字
string address = address_map["张三"] ;
string address2 = address_map.at("张三2")
c.删除
除了可以使用迭代器的方式删除外,还可以根据关键字来删除数据
//迭代器方式删除。
for(auto i = address_map.begin() ; i != address_map.end() ; i++){
if(i->first == "李四"){
address_map.erase(i);
}
}
//使用关键字删除
address_map.erase("王五");
//清空整个map
address_map.clear();
d.修改
修改其实就是替换,如果还是使用insert是不起作用的,因为它会执行唯一检查,使用at函数,对某一个特定关键字的位置修改值
map.at("张三1") = 99;
其他操作
判断是否为空、获取大小、判断是否存在key
//判断是否为空
bool empty = map.empty();
//获取大小
int size = map.size();
//查询该key在map中的个数,可用来判断是否存在该key
int count = map.count("张三1");
2、set操作
set是关键字的简单集合,并且容器内部元素不可重复且有顺序。当只是想知道一个值是否存在时,set是最有用的。set为不可重复容器,而multiset为可重复容器
a.添加
//创建容器并初始化,可变参数往里面赋值,但是这里添加了重复的3. 后面的3不会被添加进去。
set<int> s1{3,4,5,6,3};
s.insert(16);
s.insert({7,8,9,10}); //也可以接收可变参数