常用的STL
1.vector 变长数组,倍增的思想
vector<int> a(10, 3);
a.size();
a.empty();
for(int i = 0; i < 10; i++) a.push_back(i);
for(int i = 0; i < a.size(); i++) cout << a[i] << ' ';
for(vector<int>::iterator i = a.begin(); i != a.end(); i++) cout << *i << ' ';
for(auto x : a) cout << x << ' ';
size(), 返回元素个数
empty(), 返回是否为空
clear(), 清空
front()/ back(), 返回第一个数/返回最后一个数
push_back()/ pop_back(), 向最后插入一个数/删除最后一个数
begin()/end(), 第0个数和最后一个数的下一个数
vector支持随机存取
vector支持比较运算,按字典序
2.pair<int, int>
first, 第一个元素
second, 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字,按照字典序
pair<int, string> p;
cout<<p.first<<" "<<p.second;
p = make_pair(10, "yxc");
p = {20, "abc"};
pair<int, pair<int, int>> p;
3.string 字符串, substr(), c_str()
size()/length(), 返回字符串长度
empty()
clear()
string a = "yxc";
a += "def";
a += 'c';
cout << a << endl;
cout << a.substr(1, 2) << endl;
printf("%s\n", a.c_str()); //printf方法输出string
4.queue 队列
先进先出,不允许顺序遍历
queue<int> q;
q = queue<int>(); //想要清空直接重新构造即可
empty():判断队列是否为空
size():返回队列的实际元素个数
front():返回队头元素
back():返回队尾元素
push(elem):元素elem进队
pop():元素出队
没有clear(),
5.priority_queue 优先队列(堆),默认大根堆
优先队列是一种受限访问操作的存储结构,元素可以以任意顺序进入优先队列。
priority_queue<int> heap;
heap.push(-x); //小根堆
priority_queue<int, vector<int>, greater<int>> heap; //小根堆
empty():判断优先队列是否为空
size():返回优先队列的实际元素个数
push(elem):元素elem进队
top():获取队头元素
pop():元素出队
没有clear()
6.stack 栈
stack容器只有一个出口,即栈顶,可以在栈顶插入(进栈)和删除(出栈)元素,而不允许顺序遍历。
stack<int> s;
empty():判断栈是否为空
size():返回栈的实际元素个数
push(elem):元素elem进栈
top():返回栈顶
pop():元素出栈
没有clear(),
7.deque 双端队列
deuqe<int> dq1;
empty():判断双端队列是否为空
size():返回双端队列的元素个数
front():取队头元素
back():取队尾元素
push_front(elem):在队头插入元素elem
push_back(elem):在队尾插入元素elem
pop_front(elem):删除队头一个元素
pop_back(elem):删除队尾一个元素
erase():从双端队列中删除一个或几个元素
clear():删除双端队列的所有元素
begin():引用容器的第一个元素
end():引用容器的最后一个元素后面的一个位置
rbegin():引用容器的最后一个元素
rend():引用容器的第一个元素前面的一个位置
8.set,map,multiset,multimap 基于平衡二叉树(红黑树),动态维护有序数列
set<int> S;
multiset<int> MS;
map<string, int> a;
a["yxc"] = 1;
cout << a["yxc"] << endl;
size(),
empty(),
clear(),
begin()/end() 支持++/-- 返回前驱和后继 时间复杂度O(logn)
set 不能有重复元素
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数
erase()
输入一个数x,删除所有x O(k + logn)
输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound()
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器
multiset 可以有重复元素
map/multimap
insert() 插入的数是一个pair
erase() 插入的参数是pair或者迭代器
find()
支持随机存储 时间复杂度O(logn)
lower_bound()/upper_bound()
unorder_set,unordered_map,unorder_multiset,unordered_multimap 哈希表
和上面类似,增删改查的时间复杂度是O(1)
不支持lower_bound()/upper_bound(),不支持迭代器的++/--
9.List 链表
list<int> l1; // 定义元素为int的链表l1
list<int> l2(10); // 指定链表l2的初始大小为10个int元素
list<double> l3(10, 1.23); // 指定dq3的10个初始元素的初值为1.23
list<int> l4(a, a + 5); // 用数组 a[0,·· 4] 共5个元素初始化l4
empty():判断链表是否为空
size():返回链表的元素个数
push_back():在链表尾部插入元素
pop_back():删除链表的最后一个元素
remove():删除链表中所有指定值的元素
erase():从链表中删除一个或几个元素
unique():删除链表中相邻的重复元素
clear():删除链表的所有元素
insert(pos, elem):在pos位置插入元素elem
insert(pos, n, elem):在pos位置插入n个元素elem
reverse():反转链表
sort():对链表中的元素排序
begin():引用容器的第一个元素
end():引用容器的最后一个元素后面的一个位置
rbegin():引用容器的最后一个元素
rend():引用容器的第一个元素前面的一个位置
10.bitset 压位
bitset<10000> s; //长度为10000的bitset
~,&,|,^
>>,<<
==,!=
支持随机存储
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~
flip() 把第k位取反