STL中常用的容器和函数

文章目录

  • 所有容器都支持的方法
  • 栈(stack)
  • 循环队列(queue)
  • 优先队列(priority_queue)
  • 有序集合(set)
  • 向量(vector)
  • 字典(map)
  • 对组(pair)
  • 结构体(struct)
  • 字符串(string)
  • sort函数
  • max、min函数
  • abs函数
  • swap函数
  • reverse函数
  • binary_search函数
  • lower_bound函数
  • upper_bound函数
  • nth_element函数
  • __gcd函数

C++的标准模板库(Standard Template Library, 简称STL)是一个容器和算法的类库,比较常用的容器有stack、queue、priorty_queue、set、vector、pair、string等,比较常用的算法有sort、max、min、abs、swap、reverse等

所有容器都支持的方法

方法 描述 示例 时间复杂度
size 返回容器中的元素数目 s.size() O(1)
empty 判断容器是否为空,容器空时,返回true s.empty() O(1)

栈(stack)

包含在stack头文件中

特点:只能在栈顶放入元素,在栈顶删除元素,后进先出

方法 描述 示例 时间复杂度
push 入栈(栈顶) s.push(x) O(1)
pop 出栈(栈顶) s.pop() O(1)
top 返回栈顶元素 s.top() O(1)

循环队列(queue)

包含在queue头文件中

特点:只能从队头删除元素,从队尾放入元素,先进先出

方法 描述 示例 时间复杂度
push 入队(队尾) que.push(x) O(1)
pop 出队(队头) que.pop() O(1)
front 返回队头元素 que.front() O(1)
back 返回队尾元素 que.back() O(1)

优先队列(priority_queue)

包含在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由红黑树实现,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头文件中

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头文件中

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;
}

对组(pair)

包含在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)

结构体(struct)

在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是一个类,不用考虑内存分配问题,并且提供了一系列的操作函数

操作 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())

sort函数

包含在algorithm头文件中

用法: s o r t ( 起 始 地 址 , 结 束 地 址 , 排 序 方 法 ) sort(起始地址,结束地址,排序方法) sort()

注意:

  1. sort排序的范围是前闭后开,例如:sort(arr, arr+10); 排序的范围是从arr[0]到arr[9]

  2. sort的排序方法不写的话,默认是从小到大

从大到小的排序方法

bool cmp(int a, int b)
{	
	return a > b;
}

max、min函数

max(x, y):返回x和y中的最大值

min(x, y):返回x和y中的最小值

abs函数

abs(x):返回x的绝对值,x为整数。

如果要返回浮点数的绝对值,要用math.h头文件下的fabs函数

swap函数

swap(x, y):交换x和y的值

reverse函数

reverse(a, b):可以将数组指针在[a, b)之间的元素或容器的迭代器在[a, b)范围内的元素进行反转。

翻转数组

reverse(arr, arr + n);

翻转string

reverse(s.begin(), s.end());

binary_search函数

binary_search(arr, arr + n, x):在(非递减的)数组中二分查找元素x是否出现.

如果找到元素x则返回true,如果找不到则返回false。

lower_bound函数

lower_bound(arr, arr + n, x):从数组的下标0到下标n-1二分查找第一个大于或等于x的数字

如果找到则返回该数字的地址,如果找不到则返回下标n的地址。

通过返回的地址减去数组首地址,就可以得到数字在数组中的下标。

int idx = lower_bound(arr, arr + n, x) - arr;

upper_bound函数

upper_bound(arr, arr + n, x):从数组的下标0到下标n-1二分查找第一个大于x的数字

如果找到则返回该数字的地址,如果找不到则返回下标n的地址。

通过返回的地址减去数组首地址,就可以得到数字在数组中的下标。

int idx = upper_bound(arr, arr + n, x) - arr;

nth_element函数

包含在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

__gcd函数

包含在algorithm头文件中

__gcd(a, b):返回a和b的最大公约数

如果是C语言,就需要自己实现这个函数

int gcd(int a, int b)
{
	if (b == 0) return a;
	return gcd(b, a % b);
}

你可能感兴趣的:(#,数据结构,#,程序设计基础:C语言)