0%

C++中的常用STL

Vector

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vector<int> a(n, x); 	// 创建长度为n,填充为x的数组a(x不写则为0)
a.size();a.empty();
a.clear();
a.front();a.back();
a.push_back();a.pop_back();
a.begin();a.end();
a.erase(a.begin(), a.begin()+n);
a.resize(m);

// vector可以根据字典序进行比较
vector<int> a(10, -3);
vector<int> b(9, 2);
if(a < b){
cout << "a < b";
}

Pair

1
2
3
4
// 支持比较,以first为第一关键字,second为第二关键字
pair<int, int> p;
p = {1, 2};
p.first;p.second;

String

1
2
3
4
5
6
7
8
9
10
11
12
13
string str;
str.erase(i, j); // [i, j)
str.replace(i, n, s); //[i, i+n)

#include <string>
tolower(str[i]);
toupper(str[i]);

str.find(s, st); // [st, )
str.substr(i, n); // [i, i+n)
str.insert(str.begin(), x);
str.clear();
printf("%s\n%s", a, a.c_str()); // %s是从字符串首地址输出到\0为止,因此直接输出a是错误的

Queue

1
2
3
4
queue<int> q;
q.size();q.empty();
q.front();q.back();
q.push();q.pop();

Priority_Queue

1
2
3
4
5
6
7
8
9
// 默认构造大根堆
priority_queue<int> heap;
heap.push(x);
heap.top();
heap.pop();

// 若想使用小根堆
// 1. 直接插入-x
// 2. priority_queue<int, vector<int>, greater<int>> heap;

Stack

1
2
3
4
stack<int> q;
q.size();q.empty();
q.push(x);q.pop();
q.top();

Deque

1
2
3
4
5
6
7
deque<int> q;
q.size();q.empty();
q.front();q.back();
q.push_back(x);q.pop_back();
q.push_front(x);q.pop_front();
q.begin();q.end();
q.clear();

set, map, multiset, multimap基于平衡二叉树(红黑树),插入删除都是O(logn)

Set/Multiset

1
2
3
4
5
6
7
8
9
10
// set中元素不重复,multiset可重复
size();empty();
clear();
insert(x);find(x);
count(x); // 返回一个数的个数
erase();
// 1. 若输入的是数x,则删除所有x,O(logn + k),k为x的数量
// 2. 若输入的是迭代器,则删除这个迭代器
lower_bound(x); // 返回大于等于x的最小的数的迭代器
upper_bound(x); // 返回大于x的最小的数的迭代器

Map/Multimap

1
2
3
4
5
6
7
8
9
size();empty();
clear();
insert(x);find(x); // 参数是pair
count(x); // 返回一个数的个数
erase();
// 1. 若输入的是数x,则删除所有x,O(logn + k),k为x的数量
// 2. 若输入的是迭代器,则删除这个迭代器
lower_bound(x); // 返回大于等于x的最小的数的迭代器
upper_bound(x); // 返回大于x的最小的数的迭代器

unordered_set, unordered_map, unordered_multiset, unordered_multimap基于哈希表,插入删除都是O(1),不支持lower_bound()和upper_bound()

Bitset

1
2
3
4
5
6
7
8
9
bitset<10000> s;	// 类型是大小
s[1]; // 查看第二位
s.count(); // 返回有几个1
s.any(); // 是否有1
s.none(); // 是否全为0
s.set(); // 将所有位置为1
s.reset(); // 将所有位置为0
s.set(k, v); // 将第k+1位置为v
// 支持~^&|等操作,将s看成一个数