各种不同的编程语言各有千秋,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()有三种插入形式:
-
vector_name.insert(position, val);//position参数表示的是插入的位置的迭代器,val是插入的值
-
vector_name.insert(position, size, val);//size是指要插入val这个数据的次数
-
vector_name.insert(position, iterator1, iterator2);//这种一般是将另一个对象中的一段序列值插入到其中,因为迭代器是对容器对象的引用嘛,这里iterator1和iterator2是指要插入的另一个对象的迭代器插入头部与尾部的后一个
erase()有两种删除形式:
- vector_name.erase(position); //position参数表示要删除的位置的迭代器
- 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();
学会用它了,你还会喜欢用数组吗?这个可有优势多了不是吗~