方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
size | 返回容器中的元素数目 | s.size() | O(1) |
empty | 判断容器是否为空,容器空时,返回true | s.empty() | O(1) |
包含在stack头文件中
特点:只能在栈顶放入元素,在栈顶删除元素,后进先出
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 入栈(栈顶) | s.push(x) | O(1) |
pop | 出栈(栈顶) | s.pop() | O(1) |
top | 返回栈顶元素 | s.top() | O(1) |
包含在queue头文件中
特点:只能从队头删除元素,从队尾放入元素,先进先出
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 入队(队尾) | que.push(x) | O(1) |
pop | 出队(队头) | que.pop() | O(1) |
front | 返回队头元素 | que.front() | O(1) |
back | 返回队尾元素 | que.back() | O(1) |
包含在queue头文件中
priority_queue可以理解为一个大根二叉堆,堆顶元素为最大值
声明一个从大到小取出数值的优先队列
priority_queue<int> que;//大根堆
声明一个从小到大取出数值的优先队列
priority_queue<int, vector<int>, greater<int> > que;//小根堆
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
push | 把元素x插入堆 | que.push(x) | O(logn) |
pop | 删除堆顶元素 | que.pop() | O(logn) |
top | 返回堆顶元素 | que.top() | O(1) |
包含在set头文件中
set由红黑树实现,set中的元素不能重复,有自动去重的功能
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
clear | 清空 | s.clear() | O(n) |
insert | 插入元素x | s.insert(x) | O(logn) |
find | 返回等于x的元素的迭代器。若不存在等于x的元素,则返回s.end() | s.find(x) | O(logn) |
erase | 删除迭代器it指向的元素 | s.erase(it) | O(logn) |
erase | 删除等于x的元素 | s.erase(x) | O(logn) |
count | 返回集合中等于x的元素个数 | s.count(x) | O(logn) |
包含在vector头文件中
vector是一个动态数组,可以像数组一样用下标访问元素
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
clear | 清空 | v.clear() | O(n) |
push_back | 把元素x放入vector尾部 | v.push_back(x) | O(1) |
pop_back | 删除vector尾部的最后一个元素 | v.pop_back | O(1) |
包含在map头文件中
map是一个关联容器,提供一对一的键值对(key-value)映射
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
clear | 清空 | m.clear() | O(n) |
insert | 插入键值对 | m.insert(make_pair(key, value)) | O(logn) |
find | 查找key为x的二元组,并返回其迭代器 | m.find(x) | O(logn) |
[ ] 操作符 | 返回key映射到的value | m[key] | O(logn) |
[ ] 操作符 | 对m[key]来进行赋值操作 | m[key] = value | O(logn) |
如果想要遍历map,有两种方法
1、使用增强for循环(需要C++11才可以)
map<int, int> m;
for (auto item : m) {
cout << item.first << " " << item.second << endl;
}
2、使用迭代器(不需要C++11)
map<int, int> m;
map<int, int>::iterator it;
for (it = m.begin(); it != m.end(); it++){
cout << it -> first << ' ' << it -> second << endl;
}
包含在utility头文件中,但一般来说,iostream也包含它
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
make_pair | 构造一个对组 | make_pair(1, 2) | |
first | 返回第一个元素 | p.first | O(1) |
second | 返回第二个元素 | p.second | O(1) |
对pair进行排序时,默认按first进行升序,当first相等时,按second升序
无变量名的初始化:
pair<int, int> (1, 1);//未命名,值为(1,1)
有变量名的初始化:
pair<int, int> p(1, 1);//创建一个p,值为(1,1)
在C语言中,声明结构体
typedef struct Node{
int data;
struct Node* next;
}Node;
在C++中,声明结构体
struct Node{
int data;
Node * next;
};
顺序初始化结构体
struct st{
int a, b;
};
st{1, 1}; //未命名,值为{1,1}。可能会出现警告,需要C++11
st s{1, 1}; //命名为 s,值为{1,1}。可能会出现警告,需要C++11
st s = {1, 1}; //命名为 s,值为{1,1}。不会出现警告
结构体的初始化和赋值:https://www.cnblogs.com/my_life/articles/10935859.html
包含在string头文件中
string是一个类,不用考虑内存分配问题,并且提供了一系列的操作函数
操作 | string | char* |
---|---|---|
定义 | string s | char s[105] |
获取第i个字符 | s[i] | s[i] |
返回长度 | s.size() | strlen(s) |
读入一行 | getline(cin, s) | gets(s) |
赋值 | s = “hello” | strcpy(s, “hello”) |
拼接 | s += “world” | strcat(s, “world”) |
比较 | s == “hello” | strcmp(s, “hello”) |
注意s.size()返回的数据类型为unsigned long
其他常用方法
方法 | 描述 | 示例 | 时间复杂度 |
---|---|---|---|
insert | 在x位置插入字符串s1 | s.insert(x, s1) | |
replace | 从下标x开始,连续的n个字符,被替换成s1 | s.replace(x, n, s1) | |
substr | 从下标x开始,截取n个字符 | s.substr(x, n) | |
substr | 从下标x开始,截取到最后 | s.substr(x) | |
erase | 从下标x开始,删除n个字符 | s.erase(x, n) | |
erase | 从下标x开始,全部删除 | s.erase(x) | |
find | 返回s1在s中首次出现的位置,如果不存在,返回-1 | s.find(s1) | |
find | 从下标x开始,查找s1首次出现的位置 | s.find(s1, x) | |
reverse | 翻转字符串 | reverse(s.begin(), s.end()) |
包含在algorithm头文件中
用法: s o r t ( 起 始 地 址 , 结 束 地 址 , 排 序 方 法 ) sort(起始地址,结束地址,排序方法) sort(起始地址,结束地址,排序方法)
注意:
sort排序的范围是前闭后开,例如:sort(arr, arr+10); 排序的范围是从arr[0]到arr[9]
sort的排序方法不写的话,默认是从小到大
从大到小的排序方法
bool cmp(int a, int b)
{
return a > b;
}
max(x, y):返回x和y中的最大值
min(x, y):返回x和y中的最小值
abs(x):返回x的绝对值,x为整数。
如果要返回浮点数的绝对值,要用math.h头文件下的fabs函数
swap(x, y):交换x和y的值
reverse(a, b):可以将数组指针在[a, b)之间的元素或容器的迭代器在[a, b)范围内的元素进行反转。
翻转数组
reverse(arr, arr + n);
翻转string
reverse(s.begin(), s.end());
binary_search(arr, arr + n, x):在(非递减的)数组中二分查找元素x是否出现.
如果找到元素x则返回true,如果找不到则返回false。
lower_bound(arr, arr + n, x):从数组的下标0到下标n-1二分查找第一个大于或等于x的数字
如果找到则返回该数字的地址,如果找不到则返回下标n的地址。
通过返回的地址减去数组首地址,就可以得到数字在数组中的下标。
int idx = lower_bound(arr, arr + n, x) - arr;
upper_bound(arr, arr + n, x):从数组的下标0到下标n-1二分查找第一个大于x的数字
如果找到则返回该数字的地址,如果找不到则返回下标n的地址。
通过返回的地址减去数组首地址,就可以得到数字在数组中的下标。
int idx = upper_bound(arr, arr + n, x) - arr;
包含在algorithm头文件中
nth_element(a + 1, a + k, a + n + 1):将数组[1, n+1)范围内第k小的数字放到第k个位置上,即a[k]
详细解释:https://www.cnblogs.com/zwfymqz/p/8503692.html
包含在algorithm头文件中
__gcd(a, b):返回a和b的最大公约数
如果是C语言,就需要自己实现这个函数
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}