首页 > 编程知识 正文

vector数组的使用,vector常用函数

时间:2023-05-04 07:37:03 阅读:56032 作者:741

介绍

1 .向量是表示可变大小数组的序列容器。

2 .向量和数组一样,也采用连续的存储空间来存储元素。 这意味着可以使用下标访问向量的元素,与数组一样高效。 但是,它不像数组。 大小动态变化,由容器自动处理。

3 .本质上,向量使用动态分配数组存储其元素。 插入新元素后,此数组必须重新分配大小以增加存储空间。 这就是分配新数组,并将所有元素移动到此数组中。 因为并不是每次向容器中添加新元素时都会重新分配向量的大小,所以这是一项相对昂贵的任务。

4. vector空间分配策略: vector的存储空间大于实际所需的存储空间,因此根据增长潜力分配其他空间。 每个库使用不同的策略来权衡空间的使用和重新分配。 但是,无论如何,重新配置应该是对数增加的间隔的大小,在末尾插入要素时是以一定时间的复杂性进行的。

5 .因此,vector正在以有效的方式动态增长,以获得更多的存储空间和管理存储容量的能力。

6 .与其他动态序列容器(deques,lists and forward_lists )相比,向量在访问元素时是高效的,并且在末尾添加或删除元素是相对高效的。 对于不在末尾的其他删除和插入操作,效率很低。 优于lists和forward_lists的统一迭代器和引用。

1. 基本操作

(1)头文件#包含向量。

)2)创建向量对象,声明并初始化:

向量输入向量;//声明一个int型向量vectorint vec(5; //声明初始大小为5的int向量vectorintvec (10,1 )//声明初始大小为10且所有值为1的向量vectorintvec(tmp )//声明和tmp向量中的vec向量vectorintvec(tmp ) //向量vec中从第0到第2个值时tmpintarr[5]={1、2、3、4、5}; vectorintvec(arr,arr 5); //arr数组的元素用于vec矢量//说明的初始化。 当然,不包括arr[4]要素。 末尾的所有指针都指向结束元素的下一个元素。 //这主要是为了与vec.end ) )指针统一。 vectorintvec(arr[1],arr[4]; 将arr[1]~arr[4]范围内的元素作为vec的初始值(3) .容量

向量大小: vec.size (; 向量最大容量: vec.max_size (; 更改向量大小: vec.resize (; 向量大小: vec.capacity (; 向量空判定: vec.empty (; 减小向量大小以满足元素占用的存储区域的大小: vec.shrink_to_fit (; (4) .修正

分配多个元素: vec.assign (; //类似于在初始化时在数组中将元素添加到赋值末尾: vec.push_back (; 删除结尾元素: vec.pop_back (; 在任意位置插入元素: vec.insert (; 从任意位置删除元素: vec.erase (; vec.erase(vec.begin ) ) 2; 删除删除第三个元素vec.erase(vec.begin(I,vec.end ) )-j的区间[i,j-1]; 区间交换0到2个向量的元素。 vec.swap (; 清空向量元素: vec.clear (; (5)迭代器

开始指针: vec.begin (; 末尾指针: vec.end (; //指向最后一个元素的下一个位置是指向常量的开始指针: vec.cbegin (; //这意味着您不能修改此指针所指的内容,但可以使用其他方法进行修改,指针也可以移动。 指向常量的末尾指针: vec.cend (; )6)元素访问

下标访问:不检查vec[0] //是否越界。 下标从0开始。 at方法访问: vec.at(1() 1; //上述两者的区别在于,检查at是否越界,如果是,则抛出out of range异常访问第一个要素。 vec.front (; 访问最后一个元素: vec.back (; 返回一个指针。 int* p=vec.data (; //可能的原因是,向量是在内存中连续存储的数组,因此可以返回指针来指向该数组。 这是C 11的特性。 使用迭代器访问元素: vector int :3360迭代器it; for(it=vec.Begin ); it!=vec.end (; it ) cout*itendl; 或:

for (size_t i = 0; i < vec.size(); i++) { cout << vec.at(i) << endl; }

2.vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

#include<stdio.h>#include<algorithm>#include<vector>#include<iostream>using namespace std;typedef struct rect{ int id; int length; int width;  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。  bool operator< (const rect &a) const { if(id!=a.id) return id<a.id; else { if(length!=a.length) return length<a.length; else return width<a.width; } }}Rect;int main(){ vector<Rect> vec; Rect rect; rect.id=1; rect.length=2; rect.width=3; vec.push_back(rect); vector<Rect>::iterator it=vec.begin(); cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl; return 0;}

3 . 算法

(1) 使用reverse将元素翻转:需要头文件#include<algorithm>

reverse(vec.begin(),vec.end())`;将元素翻转(在vector中,如果一个函数中需要两个迭代器,一般后一个都不包含.)

(2)使用sort排序:需要头文件#include<algorithm>

sort(vec.begin(),vec.end())`;(默认是按升序排列,即从小到大),想要从大到小,可以使用翻转函数reverse();

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

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

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

注意:vector动态增加大小时,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此, 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。