一些约定:
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/