STL_不定长数组-vector

来源:互联网 发布:java开发项目案例 编辑:程序博客网 时间:2024/05/22 02:26

vector是一个模板类。vector 容器与数组相比其优点在于它能够根据需要随时自动调整自身的大小以便容下所要放入的元素。此外, vector 也提供了许多的方法来对自身进行操作

所需头文件:#include< vector >
1. 声明:

vector< int> a  //声明一个int型变量avector< int> a(10)  //声明一个初始大小为10的int型变量avector< int> a(10,1)  //声明一个初始大小为10且值都为1的int型变量a

2.输入输出等基本操作

输入:
(1)我们可以将 vector 初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现

arr={1,2,3,4,5};把arr中元素复制到vector数组中:vector<int>a(arr,arr+5)

(2)push_back方法

vector<int>a;int b=1;a.push_back(b);

输出:
(1.)循环输出

for(i=0; i<a.size(); i++)//循环输出数组值           cout<<a[i]<<" " ;

(2)使用遍历器输出

vector<int>::iterator t ;    for(t=a.begin(); t!=a.end(); t++)        cout<<t<<" " ;

完整代码:

//功能:输入一个数组值,然后在屏幕上输出#include<cstdio>#include<iostream>#include<vector>using namespace std;const int maxn=10000;int main(){    int i,n,a[maxn];    cin>>n;    for(i=0;i<n;i++)        cin>>a[i];    vector<int>arr(a,a+n);     vector<int>::iterator t;    for(t=arr.begin();t!=arr.end();t++)        cout<<*t<<" ";}

基本操作:
a.size() :读取大小
a.push_back(i): 向尾部添加i元素
a.pop_back() : 删除最后一个元素

3.vector中insert()的用法:

  • 指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
  • 在指定位置loc前插入num个值为val的元素
  • 在指定位置loc前插入区间[start, end)的所有元素

示例代码:

#include <iostream>#include <vector>using namespace std;int main(){    vector<int> arr;    arr.push_back(1);    arr.push_back(2);    arr.push_back(3);//指定位置loc前插入值为val的元素,返回指向这个元素的迭代器    arr.insert(arr.begin(),4);//在begin指向的数据前插入一个数据,结果为 4 1 2 3    arr.insert(arr.begin()+2,5) ;//结果为  4 1 5 2 3    arr.insert(arr.end(),6);//向末尾添加新的元素,结果为 4 1 5 2 3 6     //这里end()指向的元素是vector的最后一个元素的下一个元素,所以和begin()产生了区别    vector<int> ::iterator it;//在指定位置loc前插入num个值为val的元素        //vector<int> ::iterator bbegin=arr.begin();    arr.insert(arr.begin(),4,7); //结果为 7 7 7 7 4 1 5 2 3 6     for(it=arr.begin();it!=arr.end();it++)        cout<<*it<<" ";}

4.erase()的用法
使用该方法进行删除元素操作
vector::erase()方法有两种重载形式
如下:

iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);

如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

(1)基本操作
容器中各个元素各不相同

#include <iostream>#include <vector>using namespace std;int main(){    vector<int> arr;    for(int i=0;i<10;i++)        arr.push_back(i);    vector<int>::iterator t;    for(t=arr.begin();t!=arr.end();t++)        cout<<*t<<" ";    cout<<endl;// 结果为 0 1 2 3 4 5 6 7 8 9     arr.erase(arr.begin());//删除begin指向元素,结果为1 2 3 4 5 6 7 8 9     for(t=arr.begin();t!=arr.end();t++)        cout<<*t<<" ";    cout<<endl;    arr.erase(arr.begin());    for(t=arr.begin();t!=arr.end();t++)        cout<<*t<<" ";    ////删除begin指向元素,结果为 2 3 4 5 6 7 8 9  }

说明:要删除某个元素只需要把指向该元素的迭代器传给erase即可
(2)删除容器中相同的元素
错误做法:

#include <iostream>#include <vector>using namespace std;int main(){    vector<int> arr;    arr.push_back(1);    arr.push_back(2);    arr.push_back(3);    arr.push_back(1);    arr.push_back(2);    arr.push_back(3);    vector<int>::iterator t;    int n=2;//假如要删除元素为2    for(t=arr.begin();t!=arr.end();t++)    {        if(*t==n)        {            arr.erase(t);        }    }            for(t=arr.begin();t!=arr.end();t++)        cout<<*t<<" ";}

说明:当erase删除一个元素后,t迭代器就失效了,变为了野指针。

解决方法:直接附删除元素的下一个迭代器给他

#include <iostream>#include <vector>using namespace std;int main(){    vector<int> arr;    arr.push_back(1);    arr.push_back(2);    arr.push_back(3);    arr.push_back(1);    arr.push_back(2);    arr.push_back(3);    vector<int>::iterator t;    int n=2;//假如要删除元素为2    for(t=arr.begin();t!=arr.end();t++)    {        if(*t==n)        {            t=arr.erase(t);        }    }            for(t=arr.begin();t!=arr.end();t++)        cout<<*t<<" ";}

vector中声明二维数组:

vector<int>arr[5];第一维大小为5,第二维大小符合vector特性

示例代码:

#include<iostream>#include<vector>using namespace std;  int main()  {      vector<int>arr[5];    arr[0].push_back(1);    arr[0].push_back(2);    cout<<arr[0].size();    return 0;  }  

结果截图:

这里写图片描述