C++

STL标准模版库

Posted by Meng Cao on 2019-04-29

一些约定:

STL中的begin, end表示左闭右开的区间[begin, end)

迭代器:

用于指示容器中元素位置的抽象数据类型。

分类:
输入迭代器:用于读取。
输出迭代器:用于输出。
前向迭代器:用于读取和输出,可以向前移动。
双向迭代器:用于读取和输出,可以向前或者向后移动。
随机访问迭代器:用于读取和输出,可以向前或向后移动任意个位置。

所有指针都是随机访问迭代器。

双向迭代器支持:
解引用 *it
结构解引用 it->
自增 it++, ++it
相等关系比较 it1==it2, it1 != it2
随机访问迭代器除了支持上述操作,还支持:
大小关系比较符:it1<=it2, it1<it2, it1>=it2, it1>it2
做差:it1 - it2
加减:it+x, it-x
加减复合赋值:it+=x, it-=x

比较运算符:

使得结构体能够像基本数据类型一样比较大小。
STL一般用小于号比较传入的结构体数据类型,即a<b
struct Type{
int x, y;
bool operator<(const Type &other) const{
return (x<other.x) || (x==other.x && y<other.y);
}
}

常用函数:

较大值/较小值:

max/min

最大值/最小值:

*max_element(begin, end)
*max_element(begin, end)

交换:

swap(a,b);

填充:

fill(begin, end, value);// O(n)

随机化:

random_shuffle(begin, end);

排序:

sort(begin, end[, cmp]); //O(nlogn) 不稳定的排序,例如快排;
stable_sort(begin, end[, cmp]); //O(nlogn) 稳定的排序,例如归并排序;
默认情况下是升序排序;
cmp函数接受两个参数a,b, 若返回为真,则表示a排在b前面。

查找:

在某一升序区间中查找某个值插入的位置。 O(log n)
lower_bound(begin, end, value); //返回第一个大于等于value的位置
up_bound(begin, end, value); //返回第一个大于value的位置

去重:

O(n)
unique(begin, end); //返回去重后区间的end

全排列:

next_permutation(begin, end[, compare]);
将给定区间变成下一个排列,返回true; 如果没有下一个全排列,返回false.
第一个序列是顺序序列,最后一个序列是逆序序列。

数据类型:

值对:

pair<int, int> p = make_pair(1,2);

字符串:

str.length()
str.subtr(pos, len)
str1 + str2
str1 < str2
str.c_str() //获得char* 类型的字符数组指针
str1. find(str2) //在str1中找到str2, 返回第一次出现的位置。

动态数组:

vec.push_back(val)
vec.pop_back()
vec[i]
vec.size()
vec.begin()
vec.end()
vec.insert(iter, val)
vec.erase(iter)

栈:

s.push(val);
s.top();
s.pop();
s.empty();
s.size();

队列:

q.push(val)
q.front() //获得队首的元素
q.pop() //删除对手的元素
q.empty()
q.size()

优先队列:

std::priority_queue
q.push(val); //在队列中加入一个元素
q.top(); //获得队列中的最大值
q.pop(); //删除队列中的最大值
q.empty();
q.size();

双端队列:

std::deque
支持所有std::vector的操作,另外支持:
q.push_front(val);
q.pop_front();

集合:

std:: set
std:: multiset
集合中元素升序排序,set中每个值只能出现一次,multiset中每个值可以出现多次。
s.insert(val);
s.erase(val); //删除某一个值val
s.erase(it); //删除某一迭代器it指向的成员,返回下一个迭代器。
s.find(val); //查找某一元素val,如果找到就返回其迭代器。
s.size();
s.begin();
s.end()

c++STL中cmp函数总结
https://www.ohazyi.com/c_cmp/