C++动态数组类vector! |
文章目录
一. vector介绍
- 向量vector是C++标准模板库中的内容。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。
- 在程序设计过程中,如果我们知道数组的长度,可以定义静态数组。实际上,我们会经常遇到数组长度在一开始并不能确定的情况,那么这个时候就需要考虑用动态数组了,这样不仅节省了存储的内存,还使得程序更加灵活可靠。
- vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
- vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
二. 定义和初始化
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> arr1; //声明一个int型向量
vector<int> arr2(10); //声明一个初始大小为10的int型向量
vector<int> arr3(10, 1); //声明一个初始大小为10且值都是1的int型向量
vector<int> arr4 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //声明一个int型变量并依次赋值
vector<int> arr5(arr4); //声明并用tmp向量初始化vec向量
vector<int> vec(arr4.begin(), arr4.begin()+3); //用向量arr4的第0个到第2个值初始化vec向量
int a[5] = {1, 2, 3, 4, 5};
vector<int> vec1(a, a + 5); //将arr数组的元素用于初始化vec向量
vector<int> vec2(&a[1], &a[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值
vector<vector<int>> vec3; //声明一个二维数组
vector<vector<int>> vec4(4); //声明一个4行的二维数组
vector<vector<int>> vec5(4, vector<int>(5, 6)); //声明一个4行5列的二维数组并赋值维6
system("pause");
return 0;
}
三. 赋值和获取长度
#include<iostream>
#include<vector>
using namespace std;
int main(){
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);
vector<int> vec(4);
int len = vec.size(); // len = 4;获取长度(size)
system("pause");
return 0;
}
四. 重置大小(resize)和数组访问
重置大小配合初始化使用,随心所欲设定数组。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<vector<int>> v1(4); //声明一个4行的二维数组,对每行分别定义列数为5并赋值
for(int i=0;i<4;i++){
v1[i].resize(5, 6);
}
vector<vector<int>> array;
array.resize(3, vector<int>(4)); //修改二维数组大小为3行4列
system("pause");
return 0;
}
数组访问有下标访问、迭代器访问、指针访问及其他等方式。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v1{1, 2, 3, 4, 5}; //声明一个4行的二维数组,对每行分别定义列数为5并赋值
//1、通过下标访问数组
for(int i=0;i<v1.size();i++){
cout<<v1[i]<<" ";
}
cout<<endl;
//2、通过迭代器访问数组
for(vector<int>::iterator iter=v1.begin(); iter != v1.end(); iter++){
cout<<*iter<<" "; //依次输出 1 2 3 4 5
}
cout<<endl;
//3、通过指针访问数组
int *p=v1.data();
for(int i=0;i<v1.size();i++){
cout<<*p++<<" ";
}
system("pause");
return 0;
}
五. 插入和删除元素
插入元素。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v;
v.push_back(1); //v.push_back(p)在数组v的末尾添加元素p
v.push_back(2);
v.push_back(3);
v.insert(v.begin(), 9);
v.insert(v.begin()+3, 10);
v.insert(v.end(), 20);
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
system("pause");
return 0;
}
删除元素,使用时,要清楚数组在时刻变化。
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};
v.pop_back(); //v.pop_back()删除数组v末尾的元素
v.pop_back();
v.pop_back();
v.erase(v.begin()); //v.erase(v.it) 删除数组v.it指向位置的元素
v.erase(v.begin()+2);
v.erase(v.end()-1);
system("pause");
return 0;
}
六. 交换,反转(swap,reverse)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<int> v1{1, 2, 3};
vector<int> v2{4, 5, 6};
swap(v1, v2); //或者v1.swap(v2),输出结果相同
reverse(v1.begin(), v1.end()); //反转数组中的元素
system("pause");
return 0;
}
七. 排序(sort)
sort(begin, end, cmp)
,其中begin
为指向待sort()
的数组的第一个元素的指针,end
为指向待sort()
的数组的最后一个元素的下一个位置的指针,cmp
参数为排序准则,如果没有的话,默认以非降序排序。
- 默认形式。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<int> v{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};
sort(v.begin(), v.end()); //默认情况下升序排列
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
- 自定义cmp参数。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
//可自定义排序方式(此为降序)
bool cmp(int &a, int &b){
return a>b;
}
int main(){
vector<int> v{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};
sort(v.begin(), v.end(), cmp);
for(int i=0;i<v.size();i++){
cout<<v[i]<<" ";
}
cout<<endl;
system("pause");
return 0;
}
八. 清除和空判断(clear,empty)
#include<iostream>
#include<vector>
using namespace std;
int main(){
vector<int> v{0, 3, 5, 7, 8, 1, 4, 9, 2, 6};
v.clear(); // v = {};
v.empty(); // 1 (v为空则输出1)
system("pause");
return 0;
}
九. 二分查找算法
对于有序序列,可以采用二分查找法进行查找。它的基本思想是:升序排列的 n n n 个元素集合 a a a 分成个数大致相同的两部分,取 a [ n / 2 ] a[n/2] a[n/2] 与欲查找的 f i n d find find 作比较,如果相等则表示找到 f i n d find find,算法终止。如果 f i n d < a [ n / 2 ] find<a[n/2] find<a[n/2],则在 A A A 的前半部继续搜索 f i n d find find,如果 f i n d > a [ n / 2 ] find>a[n/2] find>a[n/2],则在 A A A 的后半部继续搜索 f i n d find find。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*二分查找 len=序列元素个数 find=欲查找数据*/
int binarySearch(vector<int> &arr, int len, int find)
{
if (len == 0)
return -1;
int low = 0, upper = len - 1, mid;
while (low <= upper)
{
/*不用(upper+low)/2,避免upper+low溢出(因为low+upper都是整形数据,是有界限的)//使用upper-low溢出的可能性大大减少*/
mid = low + (upper - low) / 2;
if (find > arr[mid])
low = mid + 1;
else if (find < arr[mid])
upper = mid - 1;
else
return mid;
}
return -1;
}
int main()
{
vector<int> arr = {5, 7, 8, 2, 6, 9, 22, 34};
sort(arr.begin(), arr.end());
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << " ";
cout << endl;
cout << binarySearch(arr, arr.size(), 22) << endl;
system("pause");
return 0;
}
2 5 6 7 8 9 22 34
6
请按任意键继续. . .
参考文章
参考了以下作者的文章,这里表示感谢!