| 张竞的博客 | C++ | 考研 | 考研经验帖 | 晴神笔记 |

C++ STL——vector

C++ STL——vector

vector简介:

  • 1、字义:向量
  • 2、实义:变长数组(长度不一定的数组)——vector可以根据下标访问元素,但是它作为容器更像是链表
  • 3、意义:vector可以避免普通数组(定长数组)超出内存的情况,可以根据需要改变自身长度
  • 4、(看不懂)应用:vector可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接表的人是非常友好的,写法也非常简洁

vector使用规范:

  • 1、必须添加头文件#include<vector>之后才能使用
  • 2、要添加using namespace std;

vector用法:

(一)vector的定义

  • 1、定义:vector<typename> name;——就是定义了一个一维变长typename型数组;typename可以是int,double,char,结构体等,也可以是STL标准容器:vector,set,queue

  • ps:如果typename也是一个STL容器,定义的时候要在>>符号中加入空格,避免C++11之前的编译器将>>认为是移位操作。
    
  • //eg1:
    vector<int> name1;
    vector<double> name2;
    vector<char> nmae3;
    vector<node> name;//node是结构体的类型
    
    //eg2:
    vector<vector<int> > name;//>>之间要加空格
    
  • 2、vector如何引入二维数组:

![IMG_20210223_172600_edit_397745510236702](C:\Users\86173\Documents\Tencent Files\1595856418\FileRecv\MobileFile\IMG_20210223_172600_edit_397745510236702.jpg)

![IMG_20210223_171006_edit_396942440935262](C:\Users\86173\Documents\Tencent Files\1595856418\FileRecv\MobileFile\IMG_20210223_171006_edit_396942440935262.jpg)

总结:理解起来,不论是哪一种二维数组的写法(二维vector、vector数组),都认为第一个出现的是第一维且纵向排列。第二维是其横向拓展。

(二)vector容器内元素的访问——vector一般有两种访问方式:

  1. 通过下标访问方式
  2. 通过迭代器访问
  • 1、通过下标访问:

    同普通数组:arr1[3]=2 //即是将vector容器arr1中下标为3的元素赋值为2

  • 2、通过迭代器访问:

    迭代器——iterator可以理解为指针,它的定义是 vector<typename>::iterator it;

    这样就得到了迭代器it,并且可以通过*it来访问vector里的元素

(三)vector的常见用途

  • 1、存储数据:作为数组使用,特别是长度不确定时
  • 2、用邻接表存储图

C++ STL——vector代码实操

//代码块————定义vector
vector<int> vi;
for(int i=1;i<=5;i++){
    vi.push_back(i);//push_back(i)在vi的末尾添加元素i,即依次添加1 2 3 4 5
}




//代码1:访问元素————通过下标或者迭代器

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=5;i++){
        vi.push_back(i);//i的值跟位置无关,仅仅代表元素的值
    }
    //vi.begin()为取vi的首元素地址,而it指向这个地址
    vector<int>::iterator it=vi.begin();
    for(int i=0;i<5;i++){
        printf("%d ",*(it+i));//输出vi[i]
    }
    return 0;
}

/**********笔记**********/
/* 
 * 1、思考:vi[i]和*(vi.begin()+i)是等价的吗?
 * *******************************是的
 * vi.begin()是取vi的首元素地址,加*是为了取该地址对应的值
 * 因此vi[i]是第i个元素的值(i可为0),vi.begin()同理
 * 因此两者一模一样,没有区别
 * 
 * 2、vi.end()的特殊性————不是vi的最后一个元素的地址
 * 老美喜欢左闭右开,因此vi.end()是指最后一个元素下一个的地址
 * 该地址不储存任何元素
**/
/**********笔记**********/

//代码2:访问元素————it的自加[it++ or ++it]

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=5;i++){
        vi.push_back(i);
    }
    //vector的迭代器不支持it < vi.end()的写法,因此循环条件只能写成it!=vi.end()
    for(vector<int>::iterator it=vi.begin();it!=vi.end();it++){//在常用STL容器中,只有在vector和string中,才允许vi.begin()+3这种迭代器加上整数的做法
        printf("%d ",*it);
    }
    return 0;
}


//代码3:vector常用函数————尾查元素函数:push_back()-----O(1)

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=3;i++){
        vi.push_back(i);//将i依次推进数组中
    }
    for(int i=0;i<vi.size();i++){
        printf("%d",vi[i]);
    }
    return 0;
}


//代码4:vector常用函数————尾删元素函数:pop_back()-----O(1)

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=3;i++){
        vi.push_back(i);
    }
    vi.pop_back();//删除vi的尾元素
    for(int i=0;i<vi.size();i++){
        printf("%d",vi[i]);
    }
    return 0;
}


//代码5:vector常用函数————元素个数函数:size()-----O(1)
//size()返回值是unsigned类型的,用%d问题不大————这一点对于所有的STL容器都是一样的

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=3;i++){
        vi.push_back(i);
    }
    printf("%d\n",vi.size());
    return 0;
}


//代码6:vector常用函数————清空函数:clear()-----O(n)

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=3;i++){
        vi.push_back(i);
    }
    vi.clear();
    printf("%d\n",vi.size());
    return 0;
}


//代码7:vector常用函数————插入函数:insert()-----O(n)
//insert(it,x)是用来向任意迭代器it处插入一个元素x

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=1;i<=5;i++){
        vi.push_back(i);
    }
    vi.insert(vi.begin()+2,-1);
    for(int i=0;i<vi.size();i++){
        // printf("%d ",vi[i]);
        printf("%d ",*(vi.begin()+i));
    }
    return 0;
}


//代码8:vector常用函数————擦除函数:erase()-----O(n)
//擦除函数的作用是擦除一个区间的元素,这个区间的长度至少为1

#include<stdio.h>
#include<vector>
using namespace std;
int main(){
    vector<int> vi;
    for(int i=5;i<=10;i++){
        vi.push_back(i);
    }printf("输出最初序列:");
    for(int i=0;i<vi.size();i++){
        printf("%d ",vi[i]);
    }
    printf("\n");

    vi.erase(vi.begin()+5);
    printf("输出没有10的序列:");
    for(int i=0;i<vi.size();i++){
        printf("%d ",vi[i]);
    }
    printf("\n");

    vi.erase(vi.begin()+1,vi.begin()+4);
    printf("删除5到9之间元素之后的序列:");
     for(int i=0;i<vi.size();i++){
        printf("%d ",vi[i]);
    }
    return 0;
}

posted @ 2021-02-28 20:07  张_竞  阅读(149)  评论(0)    收藏  举报