欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++之vector

程序员文章站 2022-03-23 17:01:20
...

C++之vector

前言

    在C++中,vector是一个十分有用的容器。

    作用:它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

    vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。

基本操作

1)头文件  

#include<vector>

2)创建vector对象  

vector<int> vec;

3)尾部插入元素

 vec.push_back(a);

4)尾部删除元素

vec.pop_back();

5)向向量中添加元素

vector<int> a;  
for(int i=0;i<10;i++)  
    a.push_back(i); 

6)使用下标访问元素

cout<<vec[0]<<endl;  //记住下标是从0开始的

7)访问首尾元素

vec.begin() 返回一个迭代器,它指向容器vec的第一个元素

    vec.end() 返回一个迭代器,它指向容器vec的最后一个元素的下一个位置

    vec.front()返回容器vec的第一个元素的引用

    vec.back()返回容器vec的最后元素的引用

8)使用迭代器访问元素

vector<int>::iterator it;
    for(it=vec.begin(); it!=vec.end(); it++)
        cout<<*it<<endl;

9)插入元素

vec.insert(vec.begin()+i, a);  //在第i+1个元素前面插入a
vec.insert(vec.begin()+1,5);  //在vec的第1个元素(从第0个算起)的位置插入数值5,如vec为1,2,3,4,插入元素后为1,5,2,3,4
vec.insert(vec.begin()+1,3,5);//在vec的第1个元素(从第0个算起)的位置插入3个数,其值都为5
vec.insert(vec.begin()+1,b+3,b+6);//b为数组,在vec的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8

10)删除元素

vec.erase(vec.begin()+2);  //删除第3个元素
vec.erase(vec.begin()+1,vec.begin()+3);  //删除vec中第1个(从第0个算起)到第2个元素,也就是说删除的元素从vec.begin()+1算起(包括它)一直到vec.begin()+3(不包括它)
vec.erase(vec.begin()+i, vec.end()+j); //删除区间[i,j-1];区间从0开始

11)向量大小

 vec.size();

12)清空  

vec.clear();

13)判断是否为空

vec.empty();  //判断vec是否为空,空则返回ture,不空则返回false

14)交换向量

vec.swap(b);  //b为向量,将vec中的元素和b中的元素进行整体性交换

15)赋值

vec.assign(b.begin(), b.begin()+3);  //b为向量,将b的0~2个元素构成的向量赋给vec
vec.assign(4,2);  //vec只含4个元素,且每个元素为2

重要算法

需包含头文件 #include<algorithm>

1)sort(vec.begin(),vec.end()); 

    对vec中的从vec.begin()(包括它)到vec.end()(不包括它)的元素进行从小到大排列

    可以通过重写排序比较函数按照降序比较,如下:

    定义排序比较函数:

    bool Comp(const int &a,const int &b)
    {
        return a>b;
    }

    调用时:sort(vec.begin(),vec.end(),Comp);这样就降序排序。

2)reverse(vec.begin(),vec.end());

    对a中的从vec.begin()(包括它)到vec.end()(不包括它)的元素倒置,但不排列,如vec中元素为1,3,2,4,倒置后为4,2,3,1。

3)copy(vec.begin(),vec.end(),b.begin()+1);

    把vec中的从vec.begin()(包括它)到vec.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开始复制,覆盖掉原有元素。

4)find(vec.begin(),vec.end(),10);

    在vec中的从vec.begin()(包括它)到vec.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置。

vector构建动态二维数组

#include <vector>
//=============================方法1=================================================

int **p = new int*[10];              //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i < 10; ++i)
{
	p[i] = new int[5];        //这样就构成10*5的数组
}

//=============================方法2=================================================
int i, j;
vector<vector<int>> array(5);
for (i = 0; i < array.size(); i++)
	array[i].resize(3);                  //这样就构成5*3的数组 

for (i = 0; i < array.size(); i++)       //赋值
{
	for (j = 0; j < array[0].size(); j++)
	{
		array[i][j] = (i + 1)*(j + 1);
	}
}