C++———STL容器个人理解(vector、queue、stack)

文章目录

  • 什么是容器
  • vector
    • 代码讲解及实现🚀
      • 声明操作
      • size
      • empty
      • clear
      • 迭代器
      • front
      • back
      • push_back
      • pop_back
      • begin/end
      • 代码测试
  • queue
    • 代码实现及讲解🚀
      • 循环队列queue
      • 声明
      • push
      • pop
      • front
      • back
      • 初始化
      • 结构体定义
      • 优先队列priority_queue
      • push
      • pop
      • top
      • 测试结果
  • stack
      • 声明
      • push/back
    • 代码实现及讲解🚀

什么是容器

在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。

vector

vector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为保证效率,只在队尾进行插入和删除操作(当然,这个操作的时间复杂度为O(1))。也可以在队头插入,不过时间复杂度为O(n)。

代码讲解及实现🚀

声明操作

#include <vector>
vector<int> a;

此时的a数组是可以动态变化的。

size

size函数返回vector的实际长度(包含的元素个数),时间复杂度为O(1)

a.size();

empty

empty函数返回一个bool类型,表明vector是否为空,时间复杂度为O(1)。

a.empty();

clear

clear函数把vector数组清空。

a.clear();

迭代器

迭代器(iterator)是一种可以遍历容器元素的数据类型。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。C++更趋向于使用迭代器而不是数组下标操作,因为标准库为每一种标准容器(如vector、map等)定义了一种迭代器类型,而只有少数容器(如vector)支持数组下标操作访问容器元素。可以通过迭代器指向你想访问容器的元素地址。

vector<int>::iterator it;
it;//相当于a[0]

front

front函数用以实现返回vector数组第一个元素,时间复杂度为O(1)

cout<<a.front()<<endl;

back

back函数用以实现返回vector数组的最后一个元素,时间复杂度为O(1)

cout<<a.back()<<endl;
//相当于返回a[a.size()-1]

push_back

push_back函数用来插入元素至队尾,时间复杂度为O(1)。

a.push_back(1);
//把1插入队尾

pop_back

pop_back函数用来实现删除队尾元素,时间复杂度为O(1)。

a.pop_back();

begin/end

begin函数返回的是vector数组的第一个迭代器,而end函数是返回最后一个元素的下一个迭代器(左开右闭)。所以直接访问a.end()是会越界的。

一般用于遍历数组,而遍历数组有多种方式

vector<int> d({123})
for(vector<int>::iterator it=d.begin();it!=d.end();it++)cout<<*it
<<' ';
cout<<endl;
for(int x:d)cout<<d<<' ';
cout<<endl;
for(int i=0;i<d.size();i++)cout<<d[i]<<' ';
cout<<endl;
for(auto it=d.begin();it!=d.end();it++)cout<<*it<<' ';
cout<<endl; 

如果要直接输出d.begin(),要站在前面加个*

可以定义一个结构体存储在vector数组中

struct R
{
   int t,w,p;
};
vector<R> a;

代码测试

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<int>a;	
	vector<int>::iterator it;
	it;//相当与a[0]


	vector<int> d({ 1,2,3 });
	cout << d[0] << ' ' << *d.begin() << endl;

	for (int i = 0; i < d.size(); i++)cout << d[i] << ' ';
	cout << endl;

	for (vector<int>::iterator i = d.begin(); i != d.end(); i++)cout << *i << ' ';
	cout << endl;

	for (auto i = d.begin(); i != d.end(); i++)cout << *i << ' ';
	cout<<endl;

	for (int x : d)cout << x << ' ';
	cout << endl;

	cout << d.front() << ' ' << d[0] << ' ' << *d.begin() << endl;

	cout << d.back() << ' ' << d[d.size()-1] << endl;

	d.push_back(4);
	for (int x : d)cout << x << ' ';
	cout << endl;
	d.pop_back();
	for (int x : d)cout << x << ' ';
	cout << endl;

	/*struct Rec
	{
		int x, y;
	};

	vector<Rec> c;*/
	system("pause");
	return 0;
}

测试结果

queue

queue主要包括循环队列queue以及优先队列priority_queue

代码实现及讲解🚀

循环队列queue

声明

#include <queue>
queue<int> q;

push

push函数主要实现队尾插入

q.push(1);

pop

弹出队头

q.pop();

front

返回队头元素

q.front();

back

返回队尾元素

q.back();

初始化

queue和priority_queue都没有clear函数,所以清除只需要初始化就好了

q=queue<int> ();

结构体定义

可以定义一个结构体存储入队列,队列的元素可以是单个数据元素,也可以是一个结构体。

struct R
{
   int a,b,c
};
queue<R> a;

优先队列priority_queue

push

将元素插入堆

pop

删除堆顶元素

top

查询堆顶元素(最大值)

测试结果

#include <iostream>
#include <queue>//包含循环队列queue以及优先队列priority_queue两个容器

using namespace std;

int main()
{
	queue<int>q;
	q.push(1);//在队头插入一个元素
	q.push(2);
	q.pop();//弹出队尾元素
	q.front();//返回队头
	cout << q.back() << endl;//返回队尾元素
	
	q = queue<int>();//初始化这个队列,和清除一致

	priority_queue<int>a;//大根堆
	a.push(1);//插入一个树,但顺序是随机的
	a.top();//取最大值
	a.pop();//删除最大值


	struct Rec
	{
		int a, x, y;
	};
	queue<Rec> b;


	//priority_queue<int, vector<int>, greater<int>>b;//小根堆

	//struct Rec
	//{
	//	int a, b;
	//	bool operator<(const Rec& t)const
	//	{
	//		return a < t.a;
	//	}
	//};
	//priority_queue<Rec>d;
	//d.push({1,2});

	system("pause");
	return 0;
}

stack

声明

#include <stack>
stack<int>stk;

push/back

插入和删除的操作,与前文一致

代码实现及讲解🚀

#include <iostream>
#include <stack>

using namespace std;

int main()
{
	stack<int> stk;
	stk.push(1);//向栈顶插入元素
	stk.top();//返回栈顶元素
	stk.pop();//弹出栈顶元素
	system("pause");
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aitee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值