STL(Standard Template Library)标准模板库
组件 | 描述 |
---|---|
容器(Containers) | 管理某一类对象的集合。各种数据结构,如:deque、list、vector、map 等。 |
算法(Algorithms) | 作用于容器。各种算法,如:sort、find、copy、for_each等 |
迭代器(iterators) | 用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。容器和算法的交流通过迭代器。 |
仿函数 | 行为类似函数,可作为算法的某种策略。重载的() |
适配器 | 一种用来修饰容器或仿函数或迭代器接口的东西 |
空间配置器 | 负责空间的配置于管理 |
(bilibili侯捷老师STL源码分析截取过来的d=====( ̄▽ ̄*)b)
容器分类
关联式容器:key-value
无序容器:用hashtable实现
标准库容器类 | 说明 |
---|---|
顺序容器 vector(矢量) deque(双端队列) list(链表) | 从容器尾部快速插入与删除,可随机直接访问任何元素 从容器头部或尾部快速插入与删除,直接访问任何元素 从任何地方快速插入与删除,双向链表 |
关联容器 set(集合) multiset(多重集合) map(映射) multimap(多重映射) | 快速查找,不允许重复值 快速查找,允许重复值 一对一映射,基于关键字快速查找,不允许重复值 一对多映射,基于关键字快速查找,允许重复值 |
其它容器 stack(栈) queue(队列) priority_queue (优先级队列) | 后进先出(LIFO) 先进先出(FIFO) 最高优先级元素总是第一个出列 |
顺序容器和关联容器的本质区别:
- 顺序容器通过元素在容器中位置存储和访问元素。
- 关联容器通过键(key)访问元素。
- set: 仅包含一个键。
- map: 元素以键-值(key-value)对的形式组织
key用作元素在map中的索引
value则表示所存储和读取的数据。
迭代器的基本操作
迭代器的基本操作,类似普通指针的操作
操作 | 效果 |
---|---|
* | 返回当前位置上的元素值。如果该元素有成员,可以通过迭代器以 ->取用 |
++ | 将迭代器前进至下一元素 |
==和!= | 判断两个迭代器是否指向同一位置 |
= | 为迭代器赋值(将所指元素的位置赋值给迭代器) |
list删除元素迭代器失效
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main(){
list<int> c;
c.push_back(8);
c.push_back(4);
c.push_back(1);
c.push_back(4);
list<int>::iterator p;
for(p = c.begin(); p != c.end(); p++){
if (*p == 1){
p = c.erase(p);
//erase(p)返回了被删除元素的下一个元素的的迭代器。( 删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。)
p--;
}
}
for (int temp:c){
cout << temp << endl;
}
return 0;
}
list里套map,数据表存学生信息
#include <iostream>
#include <map>
#include <list>
#include <utility>
#include <string>
using namespace std;
template <class T>
void showPair(pair<T,T> p){
cout << p.first << ":" << p.second << endl;
}
template <class T>
void showMap_student(map<T,T> student){
cout << "===================" << endl;
for (pair<T, T> tmp : student)
{
showPair(tmp);
}
}
int main(){
map<string, string> student1;
student1["name"] = "zhangsan";
student1["sex"] = "male";
student1["age"] = "18";
map<string, string> student2;
student2["name"] = "lisi";
student2["sex"] = "male";
student2["age"] = "19";
map<string, string> student3;
student3["name"] = "wangwu";
student3["sex"] = "female";
student3["age"] = "20";
list<map<string,string>> stuList;
stuList.push_back(student1);
stuList.push_back(student2);
stuList.push_back(student3);
cout << "display all" << endl;
for (map<string, string> tmp : stuList)
{
showMap_student(tmp);
}
cout << "find student who's name is wangwu" << endl;
for (map<string, string> tmp : stuList)
{
if (tmp["name"] == "wangwu"){
showMap_student(tmp);
break;
}
}
return 0;
}
执行结果
display all
===================
age:18
name:zhangsan
sex:male
===================
age:19
name:lisi
sex:male
===================
age:20
name:wangwu
sex:female
find student who's name is wangwu
===================
age:20
name:wangwu
sex:female