STL | vector的初始化和使用

  • vector指向量,可以理解为“变长数组”,长度根据需要而自动改变的数组。有时会碰到普通数组会超过内存的情况,可以使用vector解决。
  • 而且,vector可以用来以邻接表的方式存储图,可以解决当节点数太多,无法使用邻接矩阵,又害怕使用指针实现邻接表的时候,使用很简单。

01 vector的初始化
1⃣️ 默认初始化
vector<int> ilist1;
  • vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。
  • 这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。
二维数组的定义
vector<vector<int> > name;
vector<typename> Arrayname[arraySize];

//区别是第二种的一维长度事先固定了。
2⃣️ 通过同类型的vector进行初始化
vector<int> ilist2(ilist); 
vector<int> ilist2  = ilist;
  • 这两种方式等价 ,ilist2 初始化为ilist的拷贝,ilist必须与ilist2 类型相同,也就是同为intvector类型,ilist2将具有和ilist相同的容量和元素。
3⃣️ 通过迭代器进行初始化
vector<int> ilist3(ilist.begin()+2,ilist.end()-1);
  • ilist3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与ilist3 的元素类型相容,在本例中ilist3被初始化为{3,4,5,6}。
  • 这种初始化方法特别适合于获取一个序列的子序列。
4⃣️ 带参数的构造函数初始化
vector<int> ilist4(7);
  • 默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。
  • 当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。
5⃣️ 带参数的构造函数初始化
vector<int> ilist5(7,3);
  • 指定值初始化,ilist5被初始化为包含7个值为3的int
6⃣️ 通过数组地址初始化
int a[5]={1,2,3,4,5}
vector<int> vec_i(a,a+5);
02 vector的使用
#include<vector>

vector<int> arr;

arr.push_back(9);//在arr结尾插入数字9
arr.pop_back();//删除arr末尾最后一个项
arr.front();//arr的第一个项的值
arr.back();//arr的最后一个项的值
arr.begin();//arr的第一个项的指针
arr.end();//arr的最后一个项的指针
arr.size();//arr的实际长度
arr.erase(arr.begin(),arr.end());//删除从arr的第一个到最后一个项
arr.insert(arr.begin(),5);//在arr的头之前插入数字5
arr.insert(arr.begin(),6,5);//在arr的头之前插入6个5
arr.empty();//判断arr是否为空
arr.clear();//将arr清空

#include<algorithm>

sort(arr.begin(),arr.end());
//对vector排序

stable_sort(arr.begin(),arr.end());
//对vector稳定排序

reverse(arr.begin(),arr.end());
//反转vector

vector<int>::iterator newend = unique(arr.begin(),arr.end());
//对arr去重,并把去重后的实际个数存在迭代器newend里面

arr.erase(newend,arr.end());
//把从newend到arr最后一项(即重复的数字)去除ces
测试代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
    cout<<"Vector functions:"<<endl;
    vector<int> arr;
    arr.push_back(9);
    arr.push_back(3);
    arr.push_back(5);
    arr.push_back(5);
    arr.push_back(7);
    arr.push_back(5);
    arr.push_back(3);
    arr.push_back(4);
    arr.push_back(2);
    arr.push_back(1);
    cout<<"arr.push_back() : ";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    arr.pop_back();
    cout<<"arr.pop_back()  : ";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    cout<<"arr.front()     : "<<arr.front()<<endl;
    
    cout<<"arr.back()      : "<<arr.back()<<endl;
    
    cout<<"arr.size()      : "<<arr.size()<<endl;
    
    arr.erase(arr.begin()+4,arr.end());
    cout<<"arr.erase()     : ";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    arr.insert(arr.begin(),6,5);
    cout<<"arr.insert()    : ";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    cout<<endl<<endl<<"Algorithm functions:"<<endl;
    
    sort(arr.begin(),arr.end());
    cout<<"sort():";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    reverse(arr.begin(),arr.end());
    cout<<"reverse():";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    vector<int>::iterator oldend = arr.end();
    vector<int>::iterator newend;
    newend = unique(arr.begin(),arr.end());
    arr.erase(newend,oldend);
    cout<<"unique():";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    cout<<endl<<endl<<"Vector functions:"<<endl;
    
    cout<<"arr.empty()     : ";
    if(arr.empty() == false){
        cout<<"false"<<endl;
    }
    else{
        cout<<"true"<<endl;
    }
    
    arr.clear();
    cout<<"arr.clear()     : ";
    for(int i = 0;i<arr.size();i++){
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    
    cout<<"arr.empty()     : ";
    if(arr.empty() == false){
        cout<<"false"<<endl;
    }
    else{
        cout<<"true"<<endl;
    }
}