数据结构与基础算法——STL库(容器与容器适配器篇)

目录

容器(Containers)

序列容器

动态数组(vector)

双端队列(deque)

双向链表(list)

关联容器

有序集合(set)

键值对集合(map)

无序关联容器

无序集合(unordered_set)

无序键值对集合(unordered_map)

容器适配器(Adapters)

栈(stack)

队列(queue)

有序队列(priority_queue)


C++ STL库方便去实现数据结构与算法,这边来讲解一些常用的组件,为后面学习做铺垫。

万能头:

#include <bits/stdc++.h>
using namespace std;

容器(Containers)

容器是用来存储数据的序列,它们提供了不同的存储方式和访问模式。

序列容器

存储元素的序列,允许双向遍历。

动态数组(vector)

vector支持快速随机访问。

/*创建vector*/
vector<int> myVector;
vector<int> myVector(5); //每个值默认为0
vector<int> myVector(5, 10);

/*添加元素*/
myVector.push_back(7); //添加到末尾

/*删除元素*/
myVector.pop_back(); //删除最后一个元素

/*访问元素*/
int x = myVector[0];
int y = myVector.at(1);
int first = myVector.front() //返回第一个元素
int last = myVector.back() //返回最后一个元素

/*获取大小*/
int size = myVector.size();

/*清空元素*/
myVector.clear();
双端队列(deque)

deque支持快速插入和删除。

/*声明deque*/
deque<int> dq;

/*访问元素*/
int pos = dq[index];
int front = dq.front(); //返回队首
int back = dq.back(); //返回队尾

/*添加元素*/
dq.push_back(10); //末尾添加
dq.push_front(20); //头部添加

/*删除元素*/
dq.pop_back(); //移除末尾元素
dq.pop_front(); //移除头部元素

/*获取长度*/
int size = dq.size();

/*判断是否为空*/
bool flag = dq.empty();
双向链表(list)

list链表,支持快速插入和删除,但不支持随机访问。

/*声明list*/
list<int> l;
//初始化和vector一样

/*访问元素*/
int front = l.front();
int last = l.back();

/*添加元素、删除元素、获取长度、判断是否为空*/
//同deque常用操作一样

/*合并list*/
l1.merge(l2);

/*反转list*/
l.reverse();

关联容器

存储键值对,每个元素都有一个键(key)和一个值(value),并且通过键来组织元素。

有序集合(set)

set集合,不允许重复元素。

/*声明set*/
//不重复且有序
set<int> s;

/*添加元素*/
s.insert(10);
s.insert({20, 30, 40}); //插入多个元素

/*查找元素*/
//count()实际上是计数作用,但由于set中元素不重复,即 0 表示不存在,1 表示存在
bool flag = s.count(10); 

if (s.find(10) != s.end()) {
	//存在
}

/*判断是为空*/
bool isEmpty = s.empty();

/*删除元素*/
s.erase(10);

/*清空元素*/
s.clear();
键值对集合(map)

map映射,每个键映射到一个值。

/*声明map*/
map<string, int> mp;
//可以自定义排序(默认为升序)
map<string, int, greater<string>> mp; //降序

/*访问元素*/
int days = mp["January"]; 

/*添加元素*/
mp.insert(make_pair("February", 28));
mp.insert({"March", 31});
mp["April"] = 31;

/*删除元素*/
mp.erase("April");

/*清空元素*/
mp.clear();

/*判断元素*/
bool flag1 = mp.empty(); //map是否为空
bool flag2 = mp.count("April"); //"April"(key)是否存在
if (mp.find("April") != mp.end()) {
	//键存在
}

无序关联容器

哈希表,支持快速的查找、插入和删除。

无序集合(unordered_set)

unordered_set无序集合。

/*声明unordered_set*/
//不重复但无序
unordered_set<int> uset;

//其它的操作与set是一样的
无序键值对集合(unordered_map)

unordered_map无序映射。

/*声明unordered_map*/
//无序
unordered_map<int, int> ump;

//其它操作与map是一样的

map与unordered_map对比

map

优:内部用红黑树实现,内部元素具有有序性,查询删除等操作复杂度为O(logN)
缺:占用空间,红黑树里每个节点需要保存父子节点和红黑性质等信息,空间占用较大

unordered_map

优:内部用哈希表实现,查找速度非常快(适用于大量的查询操作)
缺:建立哈希表比较耗时

容器适配器(Adapters)

容器适配器是一种特殊容器,它们通过封装其他序列式容器(如vectordequelist来提供特定的功能。

容器适配器的作用类似于电源适配器,将不适用的电源转换为适用的电源。

栈(stack)

stack是一种后进先出(LIFO)的数据结构。它只允许在一端插入和删除元素。stack适配器的底层容器可以是vectordequelist

/*声明stack*/
stack<int> s;

/*添加元素*/
s.push(1);
s.push(2);
s.push(3);

/*访问栈顶元素*/
int top = s.top();

/*移除栈顶元素*/
s.pop();

/*检查栈是否为空*/
bool flag = s.empty();
队列(queue)

queue是一种先进先出(FIFO)的数据结构。它允许在一端插入元素,在另一端删除元素。queue适配器的底层容器可以是dequelist

/*声明queue*/
queue<int> q;

/*添加元素*/
q.push(10);
q.emplace(10);

/*访问元素*/
int front = q.front(); //返回队首元素
int back = q.back(); //返回队尾元素

/*移除队首元素*/
q.pop();

/*获取队列长度*/
int size = q.size();

/*判断队列是否为空*/
bool flag = q.empty();
有序队列(priority_queue)

priority_queue是一种优先级队列,元素按照优先级排序。默认情况下,优先级最高的元素最先出队。priority_queue适配器的底层容器可以是vectordeque

/*声明priority_queue*/
//priority_queue默认是一个最大堆(降序排序)
priority_queue<int> pq;

//priority_queue<Type, Container, Functional>
//Type-元素类型,Container-必须使用数组实现的容器(如deque,vector),Functional是要实现的排序规则(可以自定义比较函数)
priority_queue<int, vector<int>, greater<int>> pq; //升序排序
priority_queue<int, vector<int>, less<int>> pq; //降序排序

//自定义排序
struct compare {
	bool operator()(int a, int b) {
		return a > b;
	}
}
priority_queue<int, vector<int>, compare> pq;

/*添加元素*/
q.push(10);

/*访问元素*/
int front = pq.top(); //返回队首元素

/*移除队首元素*/
q.pop();

/*获取队列长度*/
int size = q.size();

/*判断队列是否为空*/
bool flag = q.empty();

大家写算法题的时候可以多用用这些容器。

ps:给博主点个免费的关注,后面将持续更新数据结构与算法以及其它计算机相关知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值