C++ 标准模板库(STL)

本文介绍了C++中的几种基本数据结构和容器,包括vector(动态数组)、stack(栈)、queue(队列)、deque(双向队列)、priority_queue(优先队列)、map(映射)、set(集合)、array(固定大小数组)和tuple(元组),以及它们的主要操作和特性。
摘要由CSDN通过智能技术生成

1、vector

        动态数组,可随时添加删除元素,在堆空间开辟内存。

方法含义
front()

返回第一个元素O(1)

back()返回最后一个元素O(1)
pop_back()删除最后一个元素O(1)
push_back(ele)在末尾插入元素O(1)
size()返回实际元素个数O(1)
clear()清除所有元素O(N)
resize(n, v)重置数组大小为n,初始值为v(默认0)
insert(it, x)在迭代器it处插入元素x O(N)
erase(first, last)

删除[first,last)的所有元素O(N)

begin()返回首元素的迭代器O(1)
end()返回最后一个元素后一个位置的迭代器O(1)
empty()判断该数组是否为空O(1)

2、stack

        栈,先进后出,后进先出。栈只能对栈顶元素进行操作,如果遍历,只能将栈中元素一个个取出来存在数组中。

方法含义
push(ele)元素ele入栈,增加元素O(1)
pop()移除栈顶元素O(1)
op()取得栈顶元素O(1)
empty()判断栈内是否为空O(1)
size()返回栈内元素的个数O(1)

3、queue

        队列,先进先出。

方法含义
front()返回第一个元素O(1)
back()返回最后一个元素O(1)
push(ele)在末尾插入元素O(1)
pop()删除第一个元素O(1)
size() 返回队列中元素个数O(1)
empty()判断队列是否为空O(1)

4、deque

        双向队列,首尾都可添加删除元素。

方法含义
push_back(x)/push_front(x)把x插入队尾后 / 队首O(1)
back()/front()返回队尾 / 队首元素O(1)
pop_back()/pop_front()删除队尾 / 队首元素O(1)
erase(it)

删除双端队列中的某一个元素O(1)

erase(iterator first,iterator last)删除双端队列中[first,last)中的元素O(1)
empty()判断队列是否为空O(1)
size()返回队列中元素个数O(1)
clear()清空队列O(N)

5、priority_queue

        优先队列,在堆空间开辟内存,是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。

方法含义
top() 访问队首元素O(1)
push() 入队O(logN)
pop()堆顶(队首)元素出队O(logN)
size()队列元素个数O(1)
empty()判断是否为空O(1)

注意:没有clear()方法!优先队列自定义排序规则和sort()函数定义cmp函数很相似,但是最后返回的情况是相反的。即相同的符号,最后定义的排列顺序是完全相反的。
所以只需要记住sort的排序规则和优先队列的排序规则是相反的就可以了。

示例代码:

/*
第一个参数:int就是优先队列中存储的数据类型

第二个参数:vector<int> 是用来承载底层数据结构堆的容器,若优先队列中存放的是double型数据,就要填vector<double>,总之存的是什么类型的数据,就相应的填写对应类型。同时也要改动第三个参数里面的对应类型。

第三个参数:less<int> 表示数字大的优先级大,堆顶为最大的数字; greater<int>表示数字小的优先级大,堆顶为最小的数字
*/
priority_queue<int, vector<int>, less<int> > q1;  // 大根堆, 每次取出的元素是队列中的最大值
priority_queue<int, vector<int>, greater<int>> q2; // 小根堆, 每次取出的元素是队列中的最小值


//自定义排序:

struct cmp1 {
	bool operator()(int x, int y) {
		return x > y;
	}
};
struct cmp2 {
	bool operator()(const int x, const int y) {
		return x < y;
	}
};
priority_queue<int, vector<int>, cmp1> q1; // 小根堆
priority_queue<int, vector<int>, cmp2> q2; // 大根堆

6、map

        映射,存放键值对(key-value),关联型容器,内部用红黑树实现,默认排序按照键的ASCII码顺序排列。

方法含义
begin()返回指向map头部的迭代器
clear()删除所有元素
count()返回指定元素出现的次数
empty()如果map为空则返回true
end()返回指向map末尾的迭代器
equal_range()返回特殊条目的迭代器对
erase()删除一个元素
find()查找一个元素
get_allocator()返回map的配置器
insert()插入元素
key_comp()返回比较元素key的函数
lower_bound()返回键值>=给定元素的第一个位置
max_size()返回可以容纳的最大元素个数
rbegin()返回一个指向map尾部的逆向迭代器
rend()返回一个指向map头部的逆向迭代器
size()返回map中元素的个数
swap()交换两个map
upper_bound()返回键值>给定元素的第一个位置
value_comp()返回比较元素value的函数

注意:
查找元素是否存在时,可以使用①mp.find() ② mp.count() ③ mp[key]
但是第三种情况,如果不存在对应的key时,会自动创建一个键值对(产生一个额外的键值对空间),所以为了不增加额外的空间负担,最好使用前两种方法。

示例代码:

/*插入元素的四种方式*/


map<string, string> mp;

mp["学习"] = "看书";

mp.insert(make_pair("vegetable","蔬菜"));

mp.insert(pair<string,string>("fruit","水果"));

mp.insert({"hahaha","wawawa"});


7、set

        集合,元素不会重复,当插入已有元素时,并不会插入进去,元素自动从小到大排序。

方法含义

begin()

返回指向第一个元素的迭代器

clear()

清除所有元素

count()

返回某个值元素的个数

empty()

如果集合为空,返回true

end()

返回指向最后一个元素的迭代器

equal_range()

返回集合中与给定值相等的上下限的两个迭代器

erase()

删除集合中的元素

find()

返回一个指向被查找到元素的迭代器

get_allocator()

返回集合的分配器

insert()

在集合中插入元素

lower_bound()

返回指向大于(或等于)某值的第一个元素的迭代器

key_comp()

返回一个用于元素间值比较的函数

max_size()

返回集合能容纳的元素的最大限值

rbegin()

返回指向集合中最后一个元素的反向迭代器

rend()

返回指向集合中第一个元素的反向迭代器

size()

集合中元素的数目

swap()

交换两个集合变量

upper_bound()

返回大于某个值元素的迭代器

value_comp()

返回一个用于比较元素间的值的函数

8、array

  array是C++11新增的容器,效率与普通数据相差无几,比vector效率要高,自身添加了一些成员函数。和其它容器不同,array容器的大小是固定的,无法动态的扩展或收缩,只允许访问或者替换存储的元素。array的使用要在std命名空间里。

9、tuple

        元组,tuple模板是pair的泛化,可以封装不同类型任意数量的对象。

//声明
tuple<int, int, string> t1;

//赋值
t1 = make_tuple(1, 1, "hahaha");

//声明同时初始化
tuple<int, int, int, int> t2(1, 2, 3, 4);

//使用pair对象构造tuple对象,但tuple对象必须是两个元素
auto p = make_pair("wang", 1);
tuple<string, int> t3 {p}; //将pair对象赋给tuple对象

//获取tuple对象t的第一个元素
int first = get<0>(t);

//修改tuple对象t的第一个元素
get<0>(t) = 1;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值