简单数据结构与 STL 容器

目录

前言

简单线性数据结构概念

vector

deque

stack

queue

list

map

set

附件

尾声


前言

 这次给大家整理出来了简单的数据结构与 STL 容器的用法

以下 STL 容器内容参考代码可参照附件

简单线性数据结构概念

  • 栈:先进后出(FILO)的线性数据结构
  • 队列:先进先出(FIFO)的线性数据结构
  • 链表:一些结点穿成的链,每个结点存储了其下一个结点
  • 双向链表:在链表基础上每个结点存储了其上一个链表结点
  • 循环链表:首尾相连的链表

vector

向量,其实就是一个动态的数组

运算符/方法含义例子
size动态数组大小v.size();
empty判断数组是否为空if (v.empty()) ...
push_back向后插入内容v.push_back(3);
operator[]访问某位置元素int a = v[3];
pop_back弹出最后一个元素v.pop_back();
clear清空动态数组v.clear();
insert在某位置插入一个 元素(时间复杂度 是 𝑂(𝑛) 的)v.insert(3, 4);
erase删除某个/某一些元素v.erase(v.begin(), v.begin() + 1);
front, back, begin, end迭代器v.begin();

 

deque

双端队列,顾名思义可以 𝑂(1) 向头尾插入元素

运算符/方法含义例子
size队列大小q.size();
empty判断链表是否为空if (q.empty()) ...
push_back向后插入内容q.push_back(3);
pop_back弹出最后一个元素q.pop_back();

push_front

pop_front

同理(向前插入、弹出最前)
clear清空队列q.clear();
insert在某位置前插入一个元素q.insert(it, 4);
erase删除某个/某些元素q.erase(q.begin(),q.end());
front, back, begin, end迭代器q.end();

stack

栈,先进后出(FILO)

运算符/方法含义例子
push向栈中推入内容s.push(3);
pop弹出最后一个元素s.pop();
top查询栈顶元素int x = s.top();

queue

队列,先进先出(FIFO)

运算符/方法含义例子
push向队列中推入内容q.push(3);
pop弹出队列头元素q.pop();
front查询队列头元素int x = q.front();

list

链表,𝑂(1) 添加元素,𝑂(𝑛) 查询元素

运算符/方法含义例子
push_back向后插入内容l.push_back(3);
pop_back弹出最后一个元素l.pop_back();

push_front

pop_front

同理(向前插入、弹出最前)
clear清空链表l.clear();
insert在某位置前插入一个元素(时间复杂度是 𝑶(𝟏) 的)l.insert(it, 4);
erase删除某个位置元素l.erase(l.begin(),l.end());
front, back, begin, end迭代器l.end();

map

映射表,可以将下标和值设成各种类型,𝑂(log 𝑛) 添加元素,𝑂(log 𝑛) 查询元素对应的值

运算符/方法含义例子
operator[]访问某位置元素mp["XiaoMing"] = 114;
erase删除某个元素mp.erase("XiaoMing");
find查找某个元素(查找下标,有则返回值,无则返回尾指针)auto it = mp.find("XiaoMing");

set

集合,自动排序、去重,𝑂(log 𝑛) 添加元素,𝑂(log 𝑛) 查询元素是否存在

运算符/方法含义例子
insert添加元素st.insert(123);
erase删除某个元素st.erase(123);
find查找某个元素auto it = st.find(137);
count计算某个元素出现 了多少次int x = st.count(136);

lower_bound

upper_bound

查找第一个大于 (等于)给定元素 的元素位置auto it = st.lower_bound(4);

附件

#include <iostream>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <list>
#include <map>
#include <set>
using namespace std;

int main() {
	//向量 vector
	vector <int> v = {1, 7, 2, 8, 9, 2};
	vector <int> v1 = v;
	v1.clear();
	v1.push_back(100);
	v1.push_back(200);
	v1.pop_back();
	v.insert(v.begin() + 1, 999);
	v.insert(v.end() - 1, 998);
	v.erase(v.begin() + 2, v.begin() + 5 + 1);
	v.erase(v.begin(), v.begin() + 1);
	for(auto a : v)
		cout << a << ' ';
	cout << '\n';
	cout << v[0] << "\n\n";
	
	//-----------------------------------------------
	
	//双端队列 deque
	deque <int> dq = {1, 7, 2, 8, 9, 2};
	cout << dq.front() << ' ' << dq.back() << '\n';
	cout << *dq.begin() << ' ' << *(--dq.end()) << '\n';
	dq.pop_front();
	dq.pop_back();
	cout << dq.front() << ' ' << dq.back() << '\n';
	dq.push_front(168123);
	dq.push_back(619582);
	cout << dq.front() << ' ' << dq.back() << '\n';
	auto dqit = dq.begin();
	++dqit;
	++dqit;
	++dqit;
	cout << *dqit << '\n';
	dq.insert(dqit, -777777);
	cout << *dqit << ' ' << *(dqit + 1) << "\n\n";
	
	//-----------------------------------------------
	
	//栈 stack
	stack <int> s = stack <int> ({1, 7, 2, 8, 9, 2});
	cout << s.top() << '\n';
	s.pop();
	s.push(4);
	cout << s.top() << "\n\n";
	
	//-----------------------------------------------
	
	//队列 queue 
	queue <int> q = queue <int> ({1, 7, 2, 8, 9, 2});
	cout << q.front() << '\n';
	q.pop();
	q.push(4);
	cout << q.front() << "\n\n";
	
	//-----------------------------------------------
	
	//链表 list
	list <int> l = list <int> ({1, 7, 2, 8, 9, 2});
	cout << l.front() << ' ' << l.back() << '\n';
	cout << *l.begin() << ' ' << *(--l.end()) << '\n';
	l.pop_front();
	l.pop_back();
	cout << l.front() << ' ' << l.back() << '\n';
	l.push_front(168123);
	l.push_back(619582);
	cout << l.front() << ' ' << l.back() << '\n';
	auto lit = l.begin();
	++lit;
	++lit;
	++lit;
	l.insert(lit, -777777);
	cout << *lit << ' ' << *(lit--) << "\n\n";
	
	//-----------------------------------------------
	
	//映射表 map 
	map <string, int> mp;
	mp["XiaoMing"] = 9999999;
	mp["XiaiHong"] = 8888888;
	cout << mp["XiaoMing"] << '\n';
	cout << mp["Xiaogang"] << '\n';
	mp.erase("XiaoMing");
	cout << mp["XiaoMing"] << "\n\n";
	
	//-----------------------------------------------
	
	//集合 set 
	set <int> st = {1, 5, 2, 11, 10, 8};
	cout << *(st.find(10)) << '\n';
	st.insert(4);
	cout << *(st.lower_bound(4)) << '\n';			//st.lower_bound(n) 返回大于等于 n 的第一个元素的位置 
	cout << *(st.upper_bound(4)) << '\n';			//st.upper_bound(n) 返回大于 n 的第一个元素的位置
	st.erase(10);
	cout << *(st.upper_bound(9)) << "\n\n";
	
	//-----------------------------------------------
	
	return 0;
}

尾声

如果这篇博客对您(您的团队)有帮助的话,就帮忙点个赞,加个关注!

最后,祝您(您的团队)在 OI 的路上一路顺风!!!

┬┴┬┴┤・ω・)ノ Bye~Bye~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值