STL是Standard Template Library的简称,中文名为标准模板库。STL是一些“容器”的集合,这些“容器”包括list、vector、set、map等。STL是C++的一部分,因此不用安装额外的库文件。 在C++标准中,STL被组织为下面的13个头文件:algorithm、deque、functional、iterator、vector、list、map、memory.h、numeric、queue、set、stack和utility。 STL容器的类型可分为以下几种:
序列式容器 向量(vector) :连续存储的元素 列表(list) 由节点组成的双向链表,每个结点包含着一个元素 双端队列(deque) 连续存储的指向不同元素的指针所组成的数组 适配器容器 栈(stack) 后进先出(LIFO)的值的排列 队列(queue) 先进先出(FIFO)的值的排列 优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 关联式容器 集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素队的谓词排列,没有两个不同的元素能够拥有相同的次序 多重集合(multiset) 允许存在两个次序相等的元素的集合 映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 多重映射(multimap) 允许键对有相等的次序的映射 对(pair) 和map类似,但只有一对键值 智能指针(auto_ptr) 将一个用new开辟内存的指针赋给auto_ptr,会自动回收空间
近期我使用较多的是map、multimap、vector和deque,因此本篇仅介绍这四类STL容器。
map是一种映射,使用方法为:map<键,值>。调用键使用first,调用值使用second。
①map的输入和输出(遍历输出)
ofstream log("log.txt"); map<string,string> m; void main() { //map的输入,下示方法为用数组方式插入数据,比较简单。 m["张三"] = "男"; m["李四"] = "女"; //map的遍历输出 for(auto it1 = m.begin(); it1 != m.end(); it1++) log << it1->first << "," << it1->second << endl; //或者明确迭代器类型,遍历输出 map<string,string>::iterator it2; for(it2 = m.begin(); it2 != m.end(); it2++) log << it2->first << "," << it2->second << endl; }②map的查询 (1)count函数来判断关键字是否出现,关键字出现时返回1,关键字没出现时返回0。 (2)find函数来定位关键字出现的位置,它返回一个迭代器。当关键字出现时,它返回关键字所在位置的迭代器;如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器。
string name = "张三"; //count函数使用示例 if(m.count(name)) log << m[name]<<endl; else log << "Not Found" << endl; //find函数使用示例 auto n = m.find(name) if(n != m.end()) log << n->second<<endlmultimap是在map的基础上实现一键多值。同样,使用方法为:multimap<键,值>,调用键使用first,调用值使用second。
①multimap的输入 multimap的输入必须使用pair类模版对象(map也可用此方式输入),输入的方式如下:
multimap<string,string> mm; void main() { mm.insert(make_pair("张三","男")); mm.insert(make_pair("张三","女")); //表示有两个同名同姓的张三,一人性别为男,一人性别为女 }与map的区别是:若map输入两个键相同的值,那么仅会保留后输入的值。仍以上式为例,map理解为张三性别为女,后输入的信息是对前面信息的修正;而multimap理解为每次输入的信息都是对的,有两个同名同姓的张三。
②multimap的输出
void main() { int n; auto it1 = mm.begin(); while(it1 != mm.end()) { log << it1->first << ":" << endl; n = mm.count(it1->first) for(i = 0; i < n; i++) { log << it1->second << " "; it1++; } } }输出结果类似于(保证了键只输出一次,值全部输出):
张三: 男 女 李四: 男 王五: 女 男 女