C++STL——序列式容器(向量vector与双端队列deque)

deque:

作者之前已经写过有关双端队列的知识,不懂戳下面链接并翻到deque的部分。

队列(入门)_Rudy1124的博客-CSDN博客

vector:

vector是 STL 提供的 内存连续的可变长度 的数组(亦称列表)数据结构。能够提供线性复杂度的插入和删除,以及常数复杂度的随机访问。

在使用它时, 需要包含头文件 vector, #include<vector> 

为什么要用vector:

先讲讲vector的缺点,由于vector是动态存储,所以时间效率在一般情况下vector是低于静态数组的。好,现在说说vector的优势。

  • vector可动态分配内存

很多时候我们不能提前开好那么大的空间,这种时候我们就需要 vector 来把内存占用量控制在合适的范围内。

  • vector 重写了比较运算符及赋值运算符

vector重载了六个比较运算符,以字典序实现,这使得我们可以方便的判断两个容器是否相等。

例如可以利用vector<char> 实现字符串比较。另外vector也重载了赋值运算符,使得数组拷贝更加方便。

  • vector 便利的初始化

由于vector重载了= 运算符,所以我们可以方便的初始化。此外从 C++11 起vector 还支持列表初始化,例如:vector<int> data={0,1,2,3,4};。

vector的使用:

声明与初始:

vector<int> a;//声明一个int型向量a
vector<int> a(10);//声明一个初始大写为10的向量
vector<int> a(10,1);//声明一个int型的长度为10的向量a初始化为1
vecotr<int> b(a);//声明并用向量a初始化向量b
vecotr<int> b(a.begin(),a.begin()+3);//将a向量中从第0个到第2个(共3个)作为向量b的初始值
//还可以用数组直接初始化向量
int n[]={1,2,3,4,5};
vector<int> a(n,n+5);//将数组n的前5个元素作为向量a的初值
vector<int> a(&n[1],&n[4]);//将n[1] - n[4]范围内的元素作为向量a的初值)作为向量b的初始值

 元素访问:

1.at()

v.at(pos)返回容器中下标为pos的引用。如果数组越界抛出std::out_of_range 类型的异常。

2.operator[]

v[pos]返回容器下标为pos的应用,不执行越界检查。

3.front()

v.front()返回首元素的引用。

4.back()

v.back()返回末尾元素的引用。

5.data()

v.data() 返回指向数组第一个元素的指针。

与迭代器有关:

6.begin()

返回指向首元素的迭代器

7.end()

返回指向数组尾端占位符的迭代器,注意是没有元素的。

8.rbegin()

返回指向逆向数组的首元素的逆向迭代器,可以理解为正向容器的末元素。

9.rend()

返回指向逆向数组末元素后一位置的迭代器,对应容器首的前一个位置,没有元素。

与长度有关:

10.empty()

empty()返回bool值,若v.empty()==true,说明v是空的,否则为非空(即empty()==false)

11.size()

size(),返回容器长度(元素数量),即std::distance(v.begin(),v.end())。

元素增删与修改

12.clear()

清空所有元素

13.insert()

 支持在某个迭代器位置插入元素、可以插入多个。复杂度与 pos 距离末尾长度成线性而非常数的

14.push_back()

 在末尾插入一个元素,均摊复杂度为 常数,最坏为线性复杂度。

15.pop_back()

 删除末尾元素,常数复杂度。

16.swap() 

与另一个容器进行交换,此操作是 常数复杂度 而非线性的。

举例:

讲了这么多来举个栗子(请看代码,可以自己试着实现):

1.

不知道迭代器的戳这里C++STL容器入门1(迭代器Iterator)!_Rudy1124的博客-CSDN博客

#include<bits/stdc++.h>

using namespace std;

int main(){
	vector<int> a;
	for(int i=1;i<=5;i++){
		int x;
		cin>>x;
		a.push_back(x);//存入元素
	}
	//两种输出方式
	for(int i=0;i<a.size();i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	vector<int>::iterator it;//利用迭代器遍历输出元素
	for(it=a.begin();it!=a.end();++it){
		cout<<*it<<" ";
	}
	return 0;
}

输出结果:

input:

1 2 3 4 5
output:

1 2 3 4 5 

1 2 3 4 5 

PS:vector还经常用来存图,可以代替链式前向星。想继续学习相关知识的戳下面的链接。

最短路(图论,内容丰富从入门到提高!!!)_Rudy1124的博客-CSDN博客

总结:

大概就讲这么多,更多STL容器C++STL——序列式容器2。

感谢观看,不妨点个赞再走!QAQ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值