STL广义上可以分为
容器 | 算法 | 迭代器 |
容器:各种数据结构
算法:各种常用的算法
迭代器:容器与算法之间的粘合剂
容器
- vector 单端数组
- string 字符串
- deque 双端数组
- stack 栈(先进后出)
- queue 队(先进先出)
- list 链表
- set/multiset 关联式容器,元素在插入时自动排序
- pair 对组创建
- map/multimap 按照元素的键值进行排序
string
本质上是一个类,类内部封装了
char*
,管理这个字符串,是一个
char*
型的容器。
构造函数
赋值
字符串拼接
查找替换
比较
字符获取
获取子串
插入删除
vector
- 可以动态扩展的单端数组
创建容器
赋值操作
容量和大小
插入和删除
数据存取
容器内元素互换
预留空间
deque
双端数组,可以对头端进行插入删除操作
构造
赋值
大小操作
插入删除
数据存取
stack
先进后出的数据结构,仅一个出口
常用接口
queue
先进先出的数据结构,有两个出口
常用接口
list
双向循环列表
功能:
将数据进行链式存储
链表
(
list
)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
结点的组成:一个是存储数据元素的
数据域
,另一个是存储下一个结点地址的
指针域
创建容器
赋值和交换
大小操作
插入和删除
数据存取
set
所有元素都会在插入时自动被排序
set/multiset
属于
关联式容器
,底层结构是用
二叉树
实现。
set
不允许容器中有重复的元素
构造和赋值
大小和交换
- size( ); //返回容器中元素的数目
- empty( ); //判断容器是否为空
- swap( ); //交换两个集合容器
插入和删除
查找和统计
排序
默认升序排列,可以使用仿函数改变排序规则
class MyCompare { public: bool operator()(int v1, int v2) { return v1 > v2; } }; //指定排序规则 set<int,MyCompare> s2;
multiset
所有元素都会在插入时自动被排序
set/multiset
属于
关联式容器
,底层结构是用
二叉树
实现。
multiset
不允许容器中有重复的元素
pair
成对出现的数据,利用对组可以返回两个数据
创建
map
map
中所有元素都是
pair
pair
中第一个元素为
key
(键值),起到索引作用,第二个元素为
value
(实值)
所有元素都会根据元素的键值自动排序
map/multimap
属于
关联式容器
,底层结构是用二叉树实现。
map
不允许容器中有重复
key
值元素
构造和赋值
大小和交换
插入和删除
查找和统计
排序
默认升序排序 可以使用仿函数自定义排序规则
class MyCompare { public: bool operator()(int v1, int v2) { return v1 > v2; } }; //利用仿函数实现从大到小排序 map<int, int, MyCompare> m;
multimap
multimap
允许容器中有重复
key
值元素
函数对象
- 重载函数操作符的类,其对象称为函数对象
- 函数对象使用重载的() 时,行为类似函数调研,也叫仿函数
- 其本质是一个类
//1、函数对象在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值
class MyAdd
{
public:
int operator()(int v1,int v2)
{
return v1 + v2;
}
};
void test01()
{
MyAdd myAdd;
cout << myAdd(10, 10) << endl;
}
//2、函数对象可以有自己的状态
class MyPrint
{
public:
MyPrint()
{
count = 0;
}
void operator()(string test)
{
cout << test << endl;
count++; //统计使用次数
}
int count; //内部自己的状态
};
void test02()
{
MyPrint myPrint;
myPrint("hello world");
myPrint("hello world");
myPrint("hello world");
cout << "myPrint调用次数为: " << myPrint.count << endl;
}
//3、函数对象可以作为参数传递
void doPrint(MyPrint &mp , string test)
{
mp(test);
}
void test03()
{
MyPrint myPrint;
doPrint(myPrint, "Hello C++");
}
谓词
- 返回bool类型的仿函数称为谓词
- 如果operator()接受一个参数,那么叫做一元谓词
- 如果operator()接受两个参数,那么叫做二元谓词
一元谓词
struct GreaterFive{
bool operator()(int val) {
return val > 5;
}
};
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
二元谓词
class MyCompare
{
public:
bool operator()(int num1, int num2)
{
return num1 > num2;
}
};
sort(v.begin(), v.end(), MyCompare());
算数仿函数
negate<int> n; cout << n(50) << endl; plus<int> p; cout << p(10, 20) << endl;
关系仿函数
//自己实现仿函数 class MyCompare { public: bool operator()(int v1,int v2) { return v1 > v2; } }; sort(v.begin(), v.end(), MyCompare()); //内建仿函数 sort(v.begin(), v.end(), greater<int>());
逻辑仿函数
vector<bool> v2; v2.resize(v.size()); transform(v.begin(), v.end(), v2.begin(), logical_not<bool>());
算法
遍历
搬运容器到另一个容器中
查找
查找元素条件查找元素查找相邻重复元素二分查找法统计元素个数按条件统计元素个数
排序
sort
对容器内元素进行排序
random_shufflfflffle洗牌 指定范围内的元素随机调整次序
merge两个容器元素合并,并存储到另一容器中
reverse将容器内元素进行反转
拷贝和替换
copy
容器内指定范围的元素拷贝到另一容器中
replace将容器内指定范围的旧元素修改为新元素
replace_if将区间内满足条件的元素,替换成指定元素
swap互换两个容器的元素
算术生成算法
#include <numeric>
accumulate计算区间内 容器元素累计总和
fill
向容器中填充指定的元素
集合算法
set_intersection求两个容器的交集
- 求交集的两个集合必须的有序序列
- 目标容器开辟空间需要从两个容器中取小值
- set_intersection返回值既是交集中最后一个元素的位置
set_union求两个集合的并集
- 求并集的两个集合必须的有序序列
- 目标容器开辟空间需要两个容器相加
- set_union返回值既是并集中最后一个元素的位置
set_difffference求两个集合的差集
求差集的两个集合必须的有序序列目标容器开辟空间需要从 两个容器取较大值set_difffference 返回值既是差集中最后一个元素的位置