vector
相当于动态数组/不定长数组
#include <vector> // 头文件
vector<int> a; // 相当于一个长度动态变化的int数组
vector<int> a({1, 2, 3});
vector<int> a(7); // 初始化为长度为7,值为默认
vector<int> a(7, 3);// 初始化为长度为7,值均为3
vector<int> b[233]; // 相当于第一维长233,第二位长度动态变化的int数组
vector<int> c(233); // 表示第一维长233
a.size() // 返回元素个数
a.resize(int n); // 分配大小
a.empty() // 返回是否为空
a.clear() // 清空
// 迭代器
vector<int>::iterator it;
// 遍历
for (int I = 0; I < a.size(); I ++) cout << a[i] << endl;
for (vector<int>::iterator it = a.begin(); it != a.end(); it ++) cout << *it << endl;
front()方法返回vector的第一个元素,等价于*a.begin() 和 a[0]。
back()方法返回vector的最后一个元素,等价于*(a.end()-1) 和 a[a.size() – 1]。
// 因为.end()指向容器的最后一个元素的后一个位置。
a.push_back(x) 把元素x插入到vector a的尾部。
b.pop_back() 删除vector a的最后一个元素。
两个vector可以进行比较(字典序)。
queue
包括循环队列queue和优先队列priority_queue两个容器
#include <queue>
queue<int> q; // 队列
priority_queue<int> q; // 大根堆
priority_queue<int, vector<int>, greater<int> q; // 小根堆
// 小根堆重载大于号,大根堆重载小于号
struct Rec {
int a, b;
bool operator> (const Rec& t) const {
return a > t.a;
}
}
// 重新初始化,清空
q = queue<int>();
循环队列 queue
push // 从队尾插入
pop // 从队头弹出
front // 返回队头元素
back // 返回队尾元素
优先队列 priority_queue
push // 把元素插入堆
pop // 删除堆顶元素
top // 查询堆顶元素(最大值)
stack
#include <stack>
.push() // 向栈顶插入
.pop() // 弹出栈顶元素
.top() // 访问栈顶元素
deque
双端队列deque是一个支持在两端高效插入或删除元素的连续线性存储空间。它就像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要O(1)的时间;与queue相比,deque像数组一样支持随机访问。
#include <deque>
[] 随机访问
begin/end // 返回deque的头/尾迭代器
front/back // 队头/队尾元素
push_back // 从队尾入队
push_front // 从队头入队
pop_back // 从队尾出队
pop_front // 从队头出队
clear // 清空队列
set
头文件set主要包括set和multiset两个容器,分别是“有序集合”和“有序多重集合”,即前者的元素不能重复,而后者可以包含若干个相等的元素。
set和multiset的迭代器称为“双向访问迭代器”,不支持“随机访问”,支持星号(*)解除引用,仅支持”++”和–“两个与算术相关的操作。
还有undered_set
#include <set>
set<int> s;
s.begin();
s.end();
s.insert(x);
s.find(x); // 返回指向该元素的迭代器。若不存在,则返回s.end()
s.lower_bound(x); // 查找大于等于x的元素中最小的一个,并返回指向该元素的迭代器。
s.upper_bound(x); // 查找大于x的元素中最小的一个,并返回指向该元素的迭代器。
s.erase(it); // 设it是一个迭代器,s.erase(it) 从s中删除迭代器it指向的元素
s.count(x); // 返回集合s中等于x的元素个数
map
Map的key和value可以是任意类型,其中key必须定义小于号运算符。
支持 [] 操作符。
还有unordered_map
#include <map>
map<string, int> m;
m["hello"] = 2;
// 遍历
for (auto it = m.begin(); it != m.end(); it++) {
cout << it->first << " " << it->second << endl;
}
// 直接访问第一个元素或者最后一个元素
cout << m.begin()->first << " " << m.begin()->second << endl;
cout << m.rbegin()->first << " " << m.rbegin()->second << endl;
// 查找map中是否存在key
map.find(key) != map.end()
map.count(key) > 0
bitset
0-1串
bitset相当于⼀个数组,但是它是从⼆进制的低位到⾼位分别为b[0]、 b[1]……的
#include <bitset>
bitset<1000> a;
// 初始化⽅式:
// bitset<5> b; 都为0
// bitset<5> b(u); u为unsigned int,如果u = 1,则输出b的结果为00001
// bitset<8> b(s); s为字符串,如"1101",则输出b的结果为00001101,在前⾯补0
// bitset<5> b(s, pos, n); 从字符串的s[pos]开始, n位⻓度
a[0] = 1;
cout << endl << b.any(); //b中是否存在1的⼆进制位
cout << endl << b.none(); //b中不存在1吗?
cout << endl << b.count(); //b中1的⼆进制位的个数
cout << endl << b.size(); //b中⼆进制位的个数
cout << endl << b.test(2); //测试下标为2处是否⼆进制位为1
b.set(4); //把b的下标为4处置1
b.reset(); //所有位归零
b.reset(3); //b的下标3处归零
b.flip(); //b的所有⼆进制位逐位取反
unsigned long a = b.to_ulong(); //b转换为unsigned long类型
pair
双关键字比较。
pair<int, string> a;
// 2 种方式
a = {3, "yxc"};
a = make_pair(4, "abc");
cout << a.first;
cout << a.second;
另一位大佬进行的总结:C ++ STL库