c++ 之vector用法

本文以int类型为例,其他类型大同小异

使用vector数组时,需包含< vector>头文件
同一功能中的不同函数独立编程,即调用后一函数时前一函数运行结果复原。(已用空行隔开)

一、定义及初始化

vector<int> vec;                                      //声明一个int型向量
vector<int> vec(8);                                   //声明一个初始大小为8的int型向量
vector<int> vec(10, -1);                              //声明一个初始大小为10且值都是-1的int型向量
vector<int> vec{1, 2, 3, 4, 5};                       //声明一个int型变量并依次赋值

vector<int> vec(tmp);                                 //声明并用tmp向量初始化vec向量
vector<int> vec(temp.begin(), temp.begin()+3);        //用向量temp的第0个到第2个值初始化vec向量

int arr[5] = {1, 2, 3, 4, 5};   
vector<int> vec(arr, arr + 5);                        //将arr数组的元素用于初始化vec向量
vector<int> vec(&arr[1], &arr[4]);                    //将arr[1]~arr[4]范围内的元素作为vec的初始值

vector<vector<int>> vec;                                      //声明一个二维数组
vector<vector<int>> vec(4);                                   //声明一个4行的二维数组
vector<vector<int>> vec(4, vector<int>(5,6));                //声明一个4行5列的二维数组并赋值维6

vector<vector<vector<int>>> a;                        //声明一个三维数组
vector<vector<vector<int>>> a(4);                     //声明一个三维数组,第一维度为4

二、赋值(assign)

// 赋值时会先清空数组
vector<int> v1{ 0, 3, 5, 7, 8, 1, 4, 9, 2, 6 };
vector<int> v2;

//v2.assign(v1.ita,v1.itb)                   将动态数组v1的[ita,itb)赋值给动态数组v2
v2.assign(v1.begin(), v1.begin()+8);

//v.assign(n,p)                              给动态数组v赋值n个元素p
v2.assign(10, 7);

三、获取长度(size)

不可使用length函数获取长度。

vector<int> vec(4)
int len = vec.size()             // len = 4;

四、改变大小(resize)

配合初始化使用,随心所欲设定数组。

vector<vector<int>> array(4);                           //声明一个4行的二维数组,对每行分别定义列数为5并赋值为6
for(int i=0;i<4;i++) {
    array[i].resize(5,6);
}

vector<vector<int>> array;
array.resize(row, vector<int>(col));                    //修改二维数组大小为row行col列

vector<vector<vector<int>>> a(2);                       //声明一个三维数组,对第一维度定义为2
for (int n = 0; n < 2; n++){                            //对三维数组第二维度定义为4
    a[n].resize(4);
}
for (int i = 0; i < 2; i++){                            //对三维数组第三维度定义为2并赋初值8
    for (int j = 0; j < 4; j++){
        a[i][j].resize(2,8);
    }
}

五、数组访问

有下标访问、迭代器访问、指针访问及其他等方式。

vector<int> vec{1, 2, 3, 4, 5}; 

//通过下标访问数组
for(int i = 0; i < vec.size(); i++){
    cout << vec[i];                       //依次输出 1 2 3 4 5
}

//通过迭代器访问数组
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++){
    cout << *iter;                        //依次输出 1 2 3 4 5
}

//通过指针访问数组
int *p = vec.data();
for (int i = 0; i < 5; i++){
	cout << *p++;                         //依次输出 1 2 3 4 5
}

//其他方式
int m = vec.front()                       // m = 1
int n = vec.back()                        // n = 5

六、添加元素(push_back、insert)

使用时,要清楚数组在时刻变化。

vector<int> v; 

//v.push_back(p)              在数组v的末尾添加元素p
v.push_back(1);               
v.push_back(2);               
v.push_back(3);               

//v.insert(v.it,p)            在数组v.it指向位置插入元素p
v.insert(v.begin(),8);      
v.insert(v.begin()+2,1);    
v.insert(v.end(),3);      
    
//v.insert(v.it,n,p)          在数组v.it指向位置插入n个元素p
v.insert(v.end(),4,1);

七、删除元素(pop_back、erase、remove)

使用时,要清楚数组在时刻变化。

vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};

//v.pop_back()                 删除数组v末尾的元素
v.pop_back(); 
v.pop_back(); 
v.pop_back(); 

//v.erase(v.it)                删除数组v.it指向位置的元素
v.erase(v.begin());
v.erase(v.begin()+2);
v.erase(v.end()-1);

//v.erase(v.it,n)              该函数未定义
v.erase(v.end(),4);            // error


//原理是依次将非删去元素复制到前面,没有自带函数
vector<int> v{ 0, 3, 5, 7, 5, 1, 4, 9, 2, 6 };
remove(v.begin(), v.end(), 5);                // v = { 0, 3, 7, 1, 4, 9, 2, 6, 2, 6}

八、交换、反转、合并(swap、reverse、merge)

vector<int> v1{ 1, 2, 3};
vector<int> v2{ 4, 5, 6};

//或者v1.swap(v2),输出结果相同
swap(v1, v2);                             // v1{ 4, 5, 6}   v2{ 1, 2, 3}   

//反转数组中的元素
reverse(v.begin(), v.end());              // v1{ 3, 2, 1}

// 合并两个数组元素并排序
v1.merge(v2,greater<int>());

九、排序(sort)

需包含< algorithm>头文件。

vector<int> v{ 0, 3, 5, 7, 8, 1, 4, 9, 2, 6};

//默认情况下升序排列
sort(v.begin(), v.end());                 // v{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

//可自定义排序方式(此为降序)
bool Comp(const int &a, const int &b){
	return a>b;
}
sort(v.begin(), v.end(), Comp);           // v{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}

//亦可函数内部自定义 
sort(v.begin(), v.end(), [](int &a, int &b){return a>b;});     // v{ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}

十、清除和空判断(clear、empty)

vector<int> v{ 0, 3, 5, 7, 8, 1, 4, 9, 2, 6 };

v.clear();                 // v = {};
v.empty();                 // 1  (v为空则输出1)

猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/82353068
今日推荐