STL六大组件
- 容器 算法 迭代器 适配器 仿函数 分配器
string 字符串
-
#include <string>
-
size(), length() 获得长度
-
find() 查找 形参有1个或2个
-
string::npos 值为-1,字符串末尾
-
insert() 插入
-
substr() 字符串截取
-
replace() 替换 形参有3个
-
#include <algorithm> reverse(str.begin(), str.end()) : 可以将字符串反转
vector不定长数组
- #include <vector> 动态数组 底层为顺序表(数组)
- 初始化
vector<int> v(5); //初始化5个int大小数组,里面为空
vector<int> v(5, 1); 初始化5个int大小数组,里面每个值为1
vector<vector<int> > v(5, vector<int>(6, 7)); //5行6列值为7
- size() 获得大小
- push_back() emplace_back() 尾部插入元素 形参有1个
- 扩容操作 取决于编译器去扩容 有些是2倍扩容 有些是1.5倍扩容
vector<int> v;
int tmp = -1;
for (int i = 0; i < 1000000; ++i) {
if (tmp != v.capacity()) {
tmp = v.capacity();
cout << tmp << endl;
}
v.emplace_back(i);
}
- capacity() 当前容量大小
stack 栈
- 容器适配器 双端队列组成 #include <stack>
- size() 存储元素数量
- push() 栈顶插入元素
- pop() 弹出栈顶元素
- top() 访问栈顶元素
- empty() 判断是否为空
queue 队列
- 容器适配器 双端队列组成 #include <queue>
- size() 队列元素数量
- push() 队列尾插入元素
- pop() 队首元素出列
- front() 访问队首元素
- back() 访问队尾元素
- empty() 判断是否为空
deque 双端队列
- 顺序容器 支持随机访问,由指针表存储 #include <deque> 底层为循环队列
- size() 返回内部存储数量
- push_front() 队列前插入元素
- push_back() 队列后插入元素
- pop_front() 队列前删除元素
- pop_back() 队列后删除元素
- empty() 判断是否为空
- front() 访问队首元素
- back() 访问队尾元素
priority_queue 优先队列
- 按照优先级出队 用堆(数组模拟二叉树)存储 默认大顶堆,优先级高的在树根 插入删除O(logn) #include <queue>
- priority_queue<数据类型, 容器, 比较方法> 可实现小顶堆 优先级小的在树根 第二个容器参数默认vector,第三个比较方法参数默认less
priority_queue<int, vector<int>, greater<int> > que; //小顶堆
-
size() 返回内部存储数量
-
push() 插入元素
-
pop() 删除堆顶元素
-
top() 访问堆顶部元素
-
empty() 是否为空
-
自定义类型node使用优先队列
struct node { int x, y; }
1)需要在自定义类型node里重载小于号运算符< 只能重载小于号运算符
struct node {
int x, y;
bool operator< (const node &b) const {
return this->x < b.x;
}
}
2)使用仿函数实现自定义类型node使用
struct cmp {
bool operator() (const node &a, const node &b) {
return a.x < b.x;
}
}
priority_queue<node, vector<node>, cmp> que;
set 集合
-
排序 去重 #include <set> 底层为红黑树
-
size() 返回内部存储数量
-
insert() 插入元素
-
erase() 删除元素
-
count() 查找元素
-
自定义类型node使用集合
struct node { int x, y; }
1)需要在自定义类型node里重载小于号运算符<
struct node {
int x, y;
bool operator< (const node &b) const {
return this->x < b.x;
}
}
map 键值对
- 按照键去排序 里面装pair 有序键值队容器 #include <map> 底层为红黑树
- size() 元素数量
- insert(make_pair(键, 值)) 插入 make_pair需要引入头文件
#include <utillity>
- count() 查找
- erase() 删除
- 可通过数组下标直接访问
unordered_set
- 无序 C++11才有
#include <unordered_***>
底层为哈希表 - 用法和对应的set一样
unordered_map 哈希表
- C++11标准
- 无序 C++11才有
#include <unordered_***>
底层为哈希表 - 用法和对应的set、map一样
-
- 头文件:《hash_map》《ext/hash_map》
- 命名空间:__gnu_cxx
- 声明:
hash_map<key_type, value_type, hash_func> h;
- 内置方法:1)h.find(key); 2) h[key] = value; 3) h[key]; 4) h.begin(); 5) h.end();
hash_map 哈希表
- 用法和unordered_map一样,区别在于此用法是非标准的
multiset multimap
- 元素可以重复
- 还有
unordered_multiset unordered_multimap
即表示无序且可元素重复
list 的底层为双向链表 hash_set 的底层为哈希表
sort()排序函数
- 头文件:#include <algorithm>
- 时间复杂度 n*log2n
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(const int &a, const int &b) {
return a > b; //从大到小排序 不能有等于=号
//return a < b; //从小到大排序
}
int main() {
int arr[3] = {10, -2, 100};
sort(arr, arr + 3, cmp);
return 0;
}