参考博客:C++之STL总结精华笔记
一、STL介绍
STL(StandardTemplate Library),即标准模板库。
二、STL的六大组件
- 容器(Container)
c++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有:vector、list、deque等。其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实现。deque与vector类似,但是对于首元素提供删除和插入的双向支持。关联容器主要有map和set。map是key-value形式的,set是单值。map和set只能存放唯一的key值,multimap和multiset可以存放多个相同的key值。 - 迭代器(Iterator)
提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象; - 算法(Algorithm)
是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用; - 仿函数(Function object)
仿函数(functor)又称之为函数对象(functionobject),其实就是重载了()操作符的struct,没有什么特别的地方 - 迭代适配器(Adaptor)
- 空间配制器(allocator)
其中主要工作包括两部分:对象的创建与销毁map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value;内存的获取与释放
三、map的使用
c++map容器提供一个键值对(key/value)容器,map与multimap差别仅仅在于multimap允许一个键对应多个值。需要包含头文件#include
基本数据结构
//1.定义和初始化
map<int,string> map1; //空map
//2.常用操作方法
map1[3] = "Saniya"; //数组的方式添加元素
map1.insert(map<int,string>::value_type(2,"Diyabi"));//插入元素
//map1.insert(pair<int,string>(1,"Siqinsini"));
map1.insert(make_pair<int,string>(4,"V5"));
string str = map1[3]; //根据key取得value,key不能修改
map<int,string>::iterator iter_map = map1.begin();//取得迭代器首地址
int key = iter_map->first; //取得key
string value = iter_map->second; //取得value
map1.erase(iter_map); //删除迭代器数据
map1.erase(3); //根据key删除value
map1.size(); //元素个数
map1.empty(); //判断空
map1.clear(); //清空所有元素
//3.遍历
for(map<int,string>::iterator iter = map1.begin();iter!=map1.end();iter++)
{
int keyk = iter->first;
string valuev = iter->second;
}
其他数据结构
Map提供一对一的数据处理能力(第一个为关键字,每个关键字只能在map中出现一次,第二个为该关键字的值),由于这个特性,在处理一对一数据的时候,map在编程上可以提供快速通道。map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。当需要使用自定义的数据结构作为键值时,编译器无法进行比较,找不到类似的模板,所以报错。因此需要重载比较操作符‘<’
struct ShortURLInfo
{
char URL[MAX_SHORT_URL_LEN + 1]; //URL
int GenerateTime; //URL生成时间(单位s)
bool operator < (const ShortURLInfo& ti) const {
return GenerateTime < ti.GenerateTime;
}
ShortURLInfo() { GenerateTime = -1; }
};
struct URLInfo
{
char URL[MAX_LONG_URL_LEN + 1]; //URL
int expireTime; //URL保留有效时长(单位s)
};
std::map<ShortURLInfo, URLInfo> MapOfURL;