STL常用容器
容器分类
- 顺序(序列式)容器:
vector
:采用线性连续空间,类似于数组;
deque
:双向开口的连续线性空间,随机存取,双端队列;
list
:双向循环链表;
slist
:单向链表;
array
:固定数组,vector
的底层即为 array
数组。
- 关联式容器:
set
(集合)和 map
(映射):都是以红黑树作为底层结构。set
不可重复,mutliset
可重复;map
不可重复,mutlimap
可重复;
hash_set(unordered_set)
和 hash_map(unordered_map)
:是基于哈希表实现的,查询时间复杂度为O(1)。
- 容器适配器:
stack
:以 deque
为底部结构并封闭其头端开口形成的;
queue
:单端队列,由 deque
实现;
pirority_queue
:优先队列,类似于堆,基于 vector
容器实现的。
1. string
- 查找和替换
1 2 3
| int find(const string& str, int pos = 0) const;
str1.find("de") != -1;
|
- 字符串存取
1 2 3 4 5
| back() const; front() const;
str1.back(); str1.front();
|
- 字符串比较
1 2 3
| int compare(const string &s) const;
s1.compare(s2) == 0;
|
- string插入和删除
1 2 3
| string& insert(int pos, const string& str); string& erase(int pos, int n = npos); push_back();
|
- string子串
1 2 3
| string substr(int pos = 0, int n = npos) const;
string subStr = str.substr(1, 3);
|
- string转换
1 2 3 4 5 6 7 8
| string s = to_string(val);
int n = stoi(s);
float a = stof(s)
int a = atoi(c);
|
- 字符char操作
2.vector容器
- vector容量和大小
1 2 3 4 5 6 7
| empty(); capacity(); size(); resize(int num);
resize(int num, elem);
|
- vector插入和删除
1 2 3 4 5 6 7
| push_back(ele); pop_back(); insert(const_iterator pos, ele); insert(const_iterator pos, int count, ele); erase(const_iterator pos); erase(const_iterator start, const_iterator end); clear();
|
- vector数据存取
1 2 3 4
| at(int idx); operator[]; front(); back();
|
- vector互换容器
1 2 3
| swap(vec);
v1.swap(v2); 将v1与v2的元素互换
|
deque容器
双端队列,可以对头端进行插入删除操作
- deque 插入和删除
1 2 3 4 5 6 7 8 9 10 11 12
| push_back(elem); push_front(elem); pop_back(); pop_front();
insert(pos,elem); insert(pos,n,elem); insert(pos,beg,end); clear(); erase(beg,end); erase(pos);
|
- deque 数据存取
1 2 3 4
| at(int idx); operator[]; front(); back();
|
- deque 排序
1 2 3
| sort(iterator beg, iterator end)
sort(d.begin(), d.end());
|
stack容器
- 数据存取
1 2 3 4 5 6
| push(elem); emplace(elem);
pop(); top();
|
- 大小操作
queue 容器
单端队列允许从一端新增元素(队尾),从另一端移除元素(队头),但是两端都可以访问
- 数据存取
1 2 3 4
| push(elem); pop(); back(); front();
|
- 大小操作
优先队列-priority_queue
priority_queue 通常基于堆(Heap)这种数据结构来实现。
使用前要包含头文件#include <queue>, 和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面优先出队。
定义:priority_queue<Type, Container, Functional>
,默认是大顶堆。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| priority_queue <int> q;
priority_queue <int, vector<int>, less<int>> q;
priority_queue <int, vector<int>, greater<int>> q;
struct cmp{ bool operator()(vector<int>& a, vector<int>& b){ return a[0] > b[0]; } }; priority_queue<vector<int>, vector<vector<int>>, cmp> q;
static bool cmp(vector<int>& a, vector<int>& b){ return a[0] > b[0]; } priority_queue<vector<int>, vector<vector<int>>, decltype(&cmp)> q(cmp);
auto cmp = [](vector<int>& a, vector<int>& b)->bool{ return a[0] > b[0]; }; priority_queue<vector<int>, vector<vector<int>>, decltype(cmp)> q(cmp);
priority_queue<vector<int>, vector<vector<int>>, decltype([](vector<int>& a, vector<int>& b){ return a[0] > b[0]; })>q;
|
和栈stack基本操作相同:
top
访问队头元素
empty
队列是否为空
size
返回队列内元素个数
push
插入元素到队尾 (并排序)
emplace
原地构造一个元素并插入队列
pop
弹出队头元素
swap
交换内容
list容器
STL中的链表是一个双向循环链表
- list插入和删除
1 2 3 4 5 6 7 8 9 10 11 12 13
| push_back(elem);
pop_back(); push_front(elem); pop_front();
insert(pos,elem); insert(pos,n,elem); insert(pos,beg,end); clear(); erase(beg,end); erase(pos); remove(elem);
|
- list 数据存取
- list 反转和排序
- list 移动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 1. splice(pos, other)
将 other 链表中的所有元素移动到当前链表的 pos 位置之前。
void splice(iterator pos, list& other);
list1.splice(list1.begin(), list2);
2. splice(pos, other, other_pos)
void splice(iterator pos, list& other, iterator it);
list1.splice(list1.end(), list2, list2.begin());
list1.splice(list1.end(), list2, list1.begin());
3. splice(pos, other, other_pos, other_last)
void splice(iterator pos, list& other, iterator first, iterator last);
list1.splice(list1.end(), list2, list2.begin(), list2.begin() + 2);
list1.splice(list1.end(), list1, list1.begin(), list1.begin()+2);
|
- list 合并
1 2 3 4 5 6 7
| void merge(list& x);
将当前链表和x链表合并。
list1.merge(list2);
|
set / multiset 容器
set基本概念
- 简介:所有元素都会在插入时自动被排序。
- 本质:set/multiset属于关联式容器,底层结构是用二叉树实现。
- set和multiset区别:set不允许容器中有重复的元素;multiset允许容器中有重复的元素。
函数
- set大小和交换
1 2 3
| size(); empty(); swap(st);
|
- set插入和删除
1 2 3 4 5
| insert(elem); clear(); erase(pos); erase(beg, end); erase(elem);
|
- set查找和统计
set和multiset区别
- set不可以插入重复数据,而multiset可以
- set插入数据的同时会返回插入结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
pair对组创建
1 2
| pair<type, type> p (value1, value2); pair<type, type> p = make_pair(value1, value2);
|
map / multimap容器
map基本概念
- 简介:
- map中所有元素都是pair
- pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
- 本质:
map/multimap属于关联式容器,底层结构是用二叉树实现。
- 优点:
可以根据key值快速找到value值
- map和multimap区别:
- map不允许容器中有重复key值元素
- multimap允许容器中有重复key值元素
函数
- map大小和交换
1 2 3
| size(); empty(); swap(st);
|
- map插入和删除
1 2 3 4 5 6 7 8 9
| insert(elem); clear(); erase(pos); erase(beg, end); erase(key);
(1)myMap[key] = value; (2)myMap.insert(make_pair(key, value)); (3)myMap.emplace(key, value);
|
- map查找和统计
STL关系对象
谓词
- 返回bool类型的仿函数称为谓词
- 如果operator()接受一个参数,那么叫做一元谓词
- 如果operator()接受两个参数,那么叫做二元谓词
内建函数对象
关系仿函数
1 2 3 4 5 6 7 8
| template<class T> bool equal_to<T> template<class T> bool not_equal_to<T> template<class T> bool greater<T> template<class T> bool greater_equal<T> template<class T> bool less<T> template<class T> bool less_equal<T>
sort(v.begin(), v.end(), greater<int>());
|
STL- 常用算法
概述:
算法主要是由头文件 algorithm、functional和numeric组成。
- algorithm 是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等;
- numeric 体积很小,只包括几个在序列上面进行简单数学运算的模板函数;
- functional 定义了一些模板类,用以声明函数对象。
遍历算法
- for_each
1 2 3 4 5
| for_each(iterator beg, iterator end, _func);
|
常用查找算法
- find
1 2 3 4 5 6 7 8
| find(iterator beg, iterator end, value);
auto it = find(v.begin(), v.end(), 5);
|
- find_if
1 2 3 4 5
| find_if(iterator beg, iterator end, _Pred);
|
- adjacent_find
1 2 3 4
| adjacent_find(iterator beg, iterator end);
|
4.binary_search(二分查找)
1 2 3 4 5 6
| bool binary_search(iterator beg, iterator end, value);
|
- count
1 2 3 4 5
| count(iterator beg, iterator end, value);
|
- count_if
1 2 3 4 5
| count_if(iterator beg, iterator end, _Pred);
|
max_element和min_element
1 2 3 4
| max_element(iterator start, iterator end, [compare comp]);
|
常用排序算法
- sort
1 2 3 4 5
| sort(iterator beg, iterator end, _Pred);
|
- random_shuffle
1 2 3 4
| random_shuffle(iterator beg, iterator end);
|
- merge
1 2 3 4
| merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
|
- reverse
1 2 3 4
| reverse(iterator beg, iterator end);
|
常用拷贝和替换算法
- copy
1 2 3 4 5
| copy(iterator beg, iterator end, iterator dest);
|
- replace
1 2 3 4 5 6
| replace(iterator beg, iterator end, oldvalue, newvalue);
|
- replace_if
1 2 3 4 5 6
| replace_if(iterator beg, iterator end, _pred, newvalue);
|
- swap
1 2 3 4
| swap(container c1, container c2);
|
常用算术生成算法
算术生成算法属于小型算法,使用时包含的头文件为 #include <numeric>。
- accumulate
1 2 3 4 5
| accumulate(iterator beg, iterator end, value);
|
- fill
1 2 3 4 5
| fill(iterator beg, iterator end, value);
|
常用集合算法
- set_intersection
1 2 3 4
| set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
|
- set_union
1 2 3 4
| set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
|
- set_difference
1 2 3 4
| set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
|