c++的助手---STL中的vector容器

      各种不同的编程语言各有千秋,c++中的STL(Standard Template Library,标准模板库)就是其区于其他语言的一大优势。它分为算法,容器,迭代器三类。标准库都指出了是库,那里面肯定就存有东西,标准库中有很多有利于程序员的代码库,就是已经写好的存在里面,咱可以直接使用,并且它支持跨平台。我们可以利用它写出高效且简洁的代码。说白了它就是我们写代码的一个工具,很好用的工具。(本文说一下用的特多的vector容器,其他的会后续发文讲述)

      c中我们学习了数组,数组中可以存取对应的数据类型的元素。但是它的容量是固定的,不可以中途修改,并且一些操作起来也相对比较麻烦费时费力(例如:删除中间元素啊,向中间插入元素啊等等)。再看看c++中vector容器,首先数组可操作的vector全部可以实现,并且可以改变大小,所以学习后使用vector容器比起使用数组是一个更好的选择。

vector作为类模板容器,怎么对其进行创建和初始化呢?

创建形式:vector<类型> 对象名;(数据类型可以是string,int,float型也可以是vector自身,容器内存放自己,对象名自拟)

初始化vector对象:

vector<T> temp1; //创建一个类型为T,名为temp1的对象
vector<T> temp2(temp1) //用temp1进行拷贝,就是拿temp1内的元素进行初始化
vector<T> temp3(n) //定义一个容量为n,名为temp3的对象,例:vector<int> v(10);
vector<T> temp4(n,i) //定义一个容量为n,并用i进行成员初始化的名为temp4的对象 例:vector<int> v(10,1);
vector<T> temp5 = {a,b,c}; //定义一个函数类型成员a,b,c名为temp5的对象;
/*i要和类型T相符合,拷贝的temp1也要和temp2类型相符合,否则报错.如何定义了容量却没进行初始化,标准库会自动初始化,就想是类里面的构造函数就懂了*/

怎么实现二维呢?

vector<vector<T>> temp; //创建了一个类型为vector<T>,名为temp的对象
/*就是说这个对象成员就是一个新的vector对象,把它当成和其他类型一致就行,进行初始化*/
//例:
vector<vector<int>> temp1(n);//就是表示里面有n个vector<int>对象成员,也就相当于二维数组中的n行
vector<vector<int>> temp2(n,vector<int>(m));/*就相当于表示二维数组中的n行m列,其实和一维定义是一致的*/

注:当vector对象没有设置容量时,不得出现数组样访问元素的形式(对象名[i]),这会导致报错null pointer。没有成员怎么访问呢对吧,这点和数组还是有区别的数组是定义即固定容量,vector可以说是一个动态数组,在这里有所不同。当然没有定义容量也是可以插入元素的,插入后会自动定义容量,插入后就可以以那种形式访问了。

下面给出错误案例和正确写法:

//错误代码
vector<int> v;
for(int i=0;i<10;++i)
v[i] = i;
//里面没有元素不能直接索引


//正确形式1:
vector<int> v;
for(int i=0;i<10;++i)
v.push_back(i);

//正确形式2:
vector<int> v(10);
for(int i=0;i<10;++i)
v[i] = i;
/*当然这种形式当i+1大于容量10后,就会报错了,所以还是上面那种更安全,但下面这种当输入数据时也会有所方便*/

vector容器中常用方法

  • push_back()      //向容器内输入元素,从序列末尾插入一个意思
  • pop_back()      //向容器内删除元素,从序列末尾删除一个意思
  • front()      //对容器内首个元素进行引用
  • back()      //对容器内最后一个元素进行引用
  • insert()      //向容器内某位置或者某段位置插入元素
  • erase()      //向容器内某位置或者某段位置删除元素
  • clear()      //清空容器内元素
  • size()      //容器内元素序列的长度
  • resize()      //重新定义容器内元素序列的长度
  • empty()      //判断容器是否为空
  • begin()      //指向容器对象头部的迭代器
  • end()      //指向容器末尾后的迭代器

(这些是个人平时觉得常会用到的,当然vector容器内方法不止这些,如果想要了解更多可翻阅书籍)

掌握初始化后就可以学习方法应用了,看代码学习吧:

push_back(), pop_back(), front(), back(), size():

 insert(), erase();

insert()有三种插入形式:

  1. vector_name.insert(position, val);//position参数表示的是插入的位置的迭代器,val是插入的值
  2. vector_name.insert(position, size, val);//size是指要插入val这个数据的次数
  3. vector_name.insert(position, iterator1, iterator2);//这种一般是将另一个对象中的一段序列值插入到其中,因为迭代器是对容器对象的引用嘛,这里iterator1和iterator2是指要插入的另一个对象的迭代器插入头部与尾部的后一个

erase()有两种删除形式:

  1. vector_name.erase(position); //position参数表示要删除的位置的迭代器
  2. vector_name.erase(startposition,endposition); //startposition表示要删除的初始位置,endposition表示要删除序列的末位置的后一个
#include<bits/stdc++.h>
using namespace std;

int main(){
	vector<int> nums = {10,8,11,7}; //创建一个vector对象,初始化序列为10,8,11,7,序列长度为4; 
	cout<<"size of nums "<<nums.size()<<endl;
	
	//我们向10与8之间插一个数  vector_name.insert(position, val);
	int val1 = 5;  //输入要插入的数 
	//cin>>val;  
	nums.insert(nums.begin()+1,val1); //要插入的位置就是第二位所以begin()+1就行
	cout<<"size of nums now "<<nums.size()<<endl;
	//输出插入后的序列 
	for(int x:nums) //新序列10,5,8,11,7 
	cout<<x<<" ";
	
	//我们在新序列的基础上在第三个元素位置上插入两个3  vector_name.insert(position, size, val);
	int val2 = 3;
	nums.insert(nums.begin()+2,2,val2);
	cout<<"\nsize of nums now "<<nums.size()<<endl;
	//输出插入后的序列 
	for(int x:nums) //新序列10,5,3,3,8,11,7 
	cout<<x<<" ";
	
	vector<int> nums1 = {5,4,6};
	//将对象nums中的第三个元素到倒数第二个元素之间的序列插入到nums1对象的第二个位置 vector_name.insert(position,iterator1,iterator2);
	nums1.insert(nums1.begin()+1,nums.begin()+2,nums.end()-1); 
	cout<<"\nsize of nums now "<<nums1.size()<<endl;
	//输出nums1插入后的序列 
	for(int x:nums1) //新序列5,3,3,8,11,4,6
	cout<<x<<" ";
	
	//删除nums1对象中的第二个元素 vector_name.erase(position);
	nums1.erase(nums1.begin()+1); 
	cout<<"\nsize of nums now "<<nums1.size()<<endl;
	//输出nums1删除后的序列 
	for(int x:nums1) //新序列5,3,8,11,4,6
	cout<<x<<" ";
	
	//删除nums1新序列第三个到倒数第二的元素序列 vector_name.erase(startposition,endposition);
	nums1.erase(nums1.begin()+2,nums1.end()-2);
	cout<<"\nsize of nums now "<<nums1.size()<<endl;
	//输出nums1删除后的序列 
	for(int x:nums1) //新序列5,3,4,6
	cout<<x<<" ";
	return 0;
}

resize(), empty():

vector<int> nums = {5,4,7,9};
cout<<"size of nums "<<nums.size()<<endl; //输出是size of nums 4

//此时如果想重新定义nums对象的长度序列
nums.resize(3); //此时序列9就木得了,nums.size()就等于3了

nums.resize(5); //此时就存在nums[4]了,vector库会对其初始化为0

/*empty()很好理解,如果容器为空就返回true(1),如果不为空就返回false(0)*/
//如果容器不为空就返回头元素
if(nums.empty()!=true)
return nums.front();

clear()就是清空容器,删除容器内的所有元素,如果初始化了容量的话,使用后就是使里面元素全部为0或null。使用格式就是 vector_name.clear();

学会用它了,你还会喜欢用数组吗?这个可有优势多了不是吗~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

假正经的小柴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值