C++STL之vector(基础篇一)

Q1:vector是什么?

答:vector是一种容器,容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。vector(矢量),是一种变长数组,即自动改变数组长度的数组(数组在定义是就确定了长度,且不可更改而vector容器长度不固定,可以随时更改)

Q2:vector如何使用?

1.添加头文件

在使用vector的时候需要添加#include <vector>才可以正常使用(这一步很重要!!

2.vector的定义

vector<类型名> 变量名;
类型名可以是int、double、char、struct,也可以是STL容器:vector、set、queue

vector<int> name;
vector<double> name;
vector<char> name;
vector<struct node> name;
vector<vector<int> > name;//注意:> >之间要加空格
  • vector数组就是一个一维数组
    (如vector<int> name;中name相当于一个存放整型变量的一维数组名)
  • 如果定义成vector数组的数组,那就是二维数组
    (如vector<int> array[SZIE]; //二维变长数组
    总结:低维是高维的地址(列如:二维数组中,它的一维形式就是地址

3.vector的初始化

  • 方法1(直接法)
vector<int> v1={
    
    1,2,3,4,5};

此时v1就相当于含有5个元素的一维数组
注意:有的版本编译器不支持这样的初始化

  • 方法2(数组指针法)
   int a[5]={
    
    1,2,3,4,5};//先定义一个数组
   vector<int> v1(a,a+5);//注意末尾指针指向最后一个元素之后的位置
   //下面为遍历vector容器,输出结果,检测初始化结果是否正确
   for(int i=0;i<v1.size();i++) //v1.size()为获取容器的大小
       cout<<v1[i]<<' ';
   cout<<endl;
   **结果:1 2 3 4 5
  • 方法3(n个elem)
vector<int> v2(3,6);//将三个6赋值给v2
    for(int i=0;i<v2.size();i++)
        cout<<v2[i]<<' ';
    cout<<endl;
    **结果:6 6 6
  • 方法4(拷贝法)
vector<int> v3(v1);//将vector容器v1作为参数传给v3,则v3容器中的数据和v1中相同
    for(int i=0;i<v3.size();i++)
        cout<<v3[i]<<' ';
    cout<<endl;
    **结果:1 2 3 4 5 

注意:作为参数传入的v1只能是vector类型,不能是数组名

  • 方法5:使用assign方法
//方法1(数组指针)
    vector<int> v4,v5,v6,v7;
    v4.assign(a,a+5);
    for(int i=0;i<v4.size();i++)
        cout<<v4[i]<<' ';
    cout<<endl;
    //方法2()
    v5.assign(4,10);
    for (int i = 0; i < v5.size(); ++i)
        cout<<v5[i]<<' ';
    cout<<endl;
    //方法3(容器赋值容器)
    v6.assign(v1.begin(),v1.end());
    for (int i = 0; i < v6.size(); ++i)
        cout<<v6[i]<<' ';
    cout<<endl;
    **结果:1 2 3 4 5 
           10 10 10 10 
           1 2 3 4 5 

**补充:**取区间元素赋值
列如,有一个数vector容器v1v1={1,2,3,4,5}我只想要将其中{2,3}赋值给vector容器v2,那么我们便可以改变指针的指向来改变存储范围,如下所示:

    v7.assign(v1.begin()+1,v1.end()-2);
    for (int i = 0; i < v7.size(); ++i) {
    
    
        cout<<v7[i]<<' ';
    }
    **结果:2 3

注意:end指针指向结束元素的下一个位置比如这里的end指针指向元素4

4.vector容器元素的输出

  • 一种是通过下标索引的方式访问数据和数组类似,如有vector容器v1,如果想访问v1的第一个元素,则通过v1[0]访问,依次类推,以上代码都是下标索引方法
  • 第二种使用at()访问,看实例:
    vector<int> v1;
    v1={
    
    1,2,3,4,5};
    for (int i = 0; i < v1.size(); ++i) {
    
    
        cout<<v1.at(i)<<' ';
    }
    cout<<endl;
    **结果:1 2 3 4 5 

拓展那么这两种访问方法有什么区别呢?
vector是一种动态数组,既然是数组那么便存在越界的可能,下面我们来看实例:

  1. 下标索引法遇到数组越界访问情况
vector<int> v1;
   v1={
    
    1,2,3,4,5};
   cout<<v1[6]<<endl;
   **结果:-1038988976
  1. at()法遇到数组越界访问情况
vector<int> v1;
   v1={
    
    1,2,3,4,5};
   cout<<v1.at(6)<<endl;
   **结果:terminate called after throwing an instance of 'std::out_of_range'

这里我们可以看到下标法遇到数组越界并不会报错,而是输出乱码,但是at()方法便会报出错误的类型,所以at()方法更有利于查找代码的错误

C++STL之vector(基础篇二)

猜你喜欢

转载自blog.csdn.net/weixin_74334323/article/details/130171281