STL容器之vector

STL容器之vector

首先声明一下:本人也是在总结归纳自己的学习经验,因为想做一些算法比赛,所以是从C语言过渡到C++上的,现在对于C++还在学习中,但是因为比赛也在逐步靠近,所以决定先学习容器,如果有什么不正确的地方欢迎指出,并且在我完全吸收C++知识后,会来重新整理归纳一边的~

首先我们需要了解什么是vector?

我们知道,vector在英文中是向量,矢量的意思。学习过线性代数的话【实际上没学也没有关系】我们可以知道,所谓向量其实就是一维的数组,所以这个vector实际上也就是一个“数组”的模板。而且与普通数组不同的是,这个数组是一个弹性的动态数组

所谓变长数组就是他的容量并不是我们定义的,而是可以扩充的~是不是很神奇!相较于普通数组:我们在刚刚创立的时候就要头痛到底该分配多少空间,vector简直就是天使!

说到这,我们就来看一下到底该怎么定义他吧~

首先导入库:


#include<vector>

库的导入非常简单,也非常好记,就是它本身~

那么接下来我们就来写出它在函数中的定义吧~

#include<iostream>
#include<vector>

using namespace std;

int main() {
 vector<int> a;
 return 0;
}

这就是我们第一次看到vector的面目~与我们通常熟悉的int,double等的声明方式好像都不太一样欸。对于从C转型过来的我看起来确实稍显别扭,那么这个声明格式究竟为什么会是这样呢?

正式了解vector~

关于这个奇怪的名字,我们就需要接触到另一个知识点了,他就是:C++模板。因为今天的主角是vextor, 关于C++模板,在这里就先不赘述了,后面有机会我会补充上的~

想要了解一个函数库,或者一个函数的最好方法,就是实验,那么在实验之前,我们需要先知道它有哪些技能:

首先我们在visual studio中先实验截图一下:
在这里插入图片描述
嗯,看起来很多的亚子,似乎有点麻烦欸。
不过不要慌~我们也不需要一个一个的尝试,我们主要要去尝试那些常用的,至于其他的,可以到用的时候再去慢慢了解

方法作用
push_back()从vector末尾加入一个元素
pop_back()从vector末尾删除一个元素
begin()返回一个指向第一个元素的迭代器
end()返回一个超尾元素的迭代器
size()返回一个元素数目
at()返回该下标的元素
maxsize()返回容器最大可能长度
empty()判断容器是否为空
insert()插入元素
clear()清空容器
capacity()当前容器大小

相对于其他的博客,我可能放的稍微多了一些,不过这些确实是最基础的操作,可能光看这些文字解释还会有一些迷糊?不要慌,接下来我也会一个一个实现一遍的~

push_back(),pop_back()和size()的套餐

首先我们先贴出示例代码:

#include<iostream>
#include<vector>
using namespace std;
int main() {
 vector<int> demo;
 cout << "当前数组长度为:" << demo.size() << endl;
 for (int i = 0; i < 10; i++) {
  demo.push_back(i);
 }
 for (int i = 0; i < demo.size(); i++) {
  cout << demo[i] <<' ';
 }
 cout << endl << "push_back后数组长度为:" << demo.size() << endl;
 while (demo.size()) {
  demo.pop_back();
 }
 cout << "pop_back后数组长度为:" << demo.size() << endl;
 return 0;
}

在这里插入图片描述

通过这个实例,我们可以很清楚的了解到三个函数的作用,作为可变数组,vector中的push_back()会在这个数组的最后加入一个元素,而pop_back()正好相反,实在末尾删除一个元素,并且我们可以用size()实时查看当前数组的长度,就好像,好像…
对就是和顺序表的感觉很像!
讲到这不仅就要补充一个知识点了,在我们平时声明的数组中,我们的数组都是实现声明长度的,所以他们会在编译的时候分配好空间,而动态数组,也就是我们这个“变长数组”则是在运行时分配的空间。
是不是超方便~

begin()和end()的探寻

之前我们说到顺序表了,如果有学过的同学那么可以很清晰地理解这些函数的含义,毕竟都是我们亲身探寻过的,那么即使没有学过也不用担心我去年也曾写过一篇顺序表的帖子,虽然当事人就稚嫩但也能稍做参考数据结构——顺序表

好了,即使完全不了解也没关系,所谓的容器更像是一个黑盒子,我们只管调用,而不问过程(虽然我仍旧建议大家学好数据结构,虽然自己写的不如容器安全,但是在特殊场景,更加灵活,也能更好理解算法思维)

那么我们继续说一说begin和end吧。

首先当然还是再来看一眼他们的描述:
begin()——返回一个指向第一个元素的迭代器
end()——返回一个超尾元素的迭代器

什么是迭代器?
迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。360百科-迭代器
如果不是很理解的话,我们可以通过如下代码实际操练一番:

#include<iostream>
#include<vector>
using namespace std;
int main() {
 vector<int> demo;
 cout << "当前数组长度为:" << demo.size() << endl;
 for (int i = 0; i < 10; i++) {
  demo.push_back(i);
 }
 for (int i = 0; i < demo.size(); i++) {
  cout << demo[i] <<' ';
 }
 cout << endl;
 /*insert就是插入元素,由于比较简单就在这里一起写了*/
 demo.insert(demo.begin() + 1, 666);
 /*从开始的地方向后数一位插入*/
 demo.insert(demo.end() - 1, 888);
 /*从最后向前向数一位插入*/
 for (int i = 0; i < demo.size(); i++) {
  cout << demo[i] << ' ';
 }
 cout << endl;
 return 0;
}

运行结果如下
在这里插入图片描述
所以对照着这个实例,我们可以理解了,所谓gegin()就是从元素的第一个位置,而end()就是从元素的最后一回位的下一位。

empty(), clear() and at()

那么关于一个容器的创建和普通操作我们都清楚了一些,接下来我们用完之后该怎么处理他们呢?对于容器中的某个元素我们怎么查找呢?

#include<iostream>
#include<vector>
using namespace std;
int main() {
 vector<int> demo;
 cout << "当前数组长度为:" << demo.size() << endl;
 for (int i = 0; i < 10; i++) {
  demo.push_back(-i);
 }
 for (int i = 0; i < demo.size(); i++) {
  cout << demo[i] <<' ';
 }
 cout << endl;
 /*注意at()的下标和数组的下标有相同的位置含义*/
 cout << "元素的第六位是" << demo.at(5) << endl;
 cout << "没有clear:";
 if (demo.empty()) {
  cout << "empty" << endl;
 }
 else {
  cout << "no empty" << endl;
 }
 demo.clear();
 cout << "clear以后:";
 if (demo.empty()) {
  cout << "empty" << endl;
 }
 else {
  cout << "no empty" << endl;
 }
 cout << endl;
 return 0;
}

我们通过这个代码来试试at()的元素查找,empty()的判空还有clear()的清空吧~

在这里插入图片描述
就像我代码中的猪食一样,empty,clear,和at的奥秘也就如此。

maxsize()和capacity()帮我们理解容器的容量问题

相较于之前的那几个算法用的方法,接下来的两个方法的作用只是帮我们理解vector的容量问题。
我们现在知道,maxsize()和capacity()一个是最大容量一个是当前容量,所以,我们可以根据我们加入元素的个数来探寻一下,在我们放入元素的时候,这个vector,到底是怎么增长自己的容量呢?他的极限又在哪了?

#include<iostream>
#include<vector>
using namespace std;
int main() {
 vector<int> demo;
 cout << "当前数组长度为:" << demo.size() << endl;
 for (int i = 0; i < 9; i++) {
  demo.push_back(i);
  cout << "demo.size() = " << demo.size() << ' ' 
    << "demo.capacity() = " << demo.capacity()
    << "demo.max_size() = " << demo.max_size() << endl;
 }
 return 0;
}

在这里插入图片描述
通过这个代码,我们可以非常直接的看到capacity的变化方式,四舍五入50%~而max_size最为最大的容量一直保持在一个很大的数的样子,但是不得不提醒大家,即使这个数看起来很大,但是有一点需要注意,我们在实际操作中,可能会有其他容器和他抢地盘,所以这个最大也仅仅是一个参考值,换句话说,作为理论值,他是很难达到的啦。

关于vector()的介绍大概就到这里啦,希望对大家也有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值