文章目录
- 什么是容器
- 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({1,2,3})
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;
}