C++ STL-vector

文章介绍了C++标准库中的vector容器,作为动态数组的特性,包括其基本介绍、初始化方式(如一维、二维初始化)、元素访问方法,以及相关的方法函数如添加、删除和修改数据。同时,提到了排序和访问注意事项,如使用sort函数排序和通过下标或迭代器访问元素。
摘要由CSDN通过智能技术生成

目录

vector:动态数组

1、基本介绍

头文件

1.1、初始化

 1.2 、元素的访问方法

2、方法函数

3、注意事项

3.1、 排序

3.2、 访问

总结:


vector:动态数组

1、基本介绍

vector为可变长数组,即动态数组,定义的vector数组可以随时添加和删除元素。

在局部函数中创建的vector数组是在对空间里面创建的,与全局变量比较类似,所以常见其再局部函数中开辟大容量数组。

vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。

Array是静态空间,一旦配置了就不能改变,如果要重新改变大小,首先要配置一块新的空间,然后将旧空间的数据搬到新开辟空间,再释放原来的空间。

Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,不必害怕空间不足而一开始就开辟一个很大空间的array了。

头文件

#include<vector>

1.1、初始化

<1> 一维初始化

vector<int> v;       //定义了一个名为v的储存数据类型为int的一维数组
vector<double> v;    //定义了一个名为v的储存数据类型为double的一维数组
vector<node> v;      //定义了一个名为v的储存数据类型为node的一维数组
  •  指定长度初始值的初始化
vector<int> v(n);    //定义一个长度为n的数组,动态定义,不指定初值默认初值为0
vector<int> v(n, 0); //所有的元素均为0
//注意:指定数组长度之后数组就相当于普通的数组了
  • 初始化中有多个元素
vector<int> a{1, 2, 3, 4, 5};// 数组a中有五个元素

 <2> 二维初始化

  • 定义第一维固定长度为5,第二维可变化的二维数组
vector<int> v[3];   //定义可变长二维数组
//此时行不可变,但列可变,一维长度不可变为3,二维可变
  • 定义动态二维数组(行列均可变)
vector<vector<int>> v;  //定义了一个行列均可变化的二维数组
  • 定义行长度n + 1,列长度 m + 1,初始值为0 的二维数组
vector<vector<int>> v(n+1,vector<int>(m+1,0));

 1.2 、元素的访问方法

 <1> 单个访问(可以按照下标访问)

cout << v[4] << endl;  //输出第五个数据
//一二维可变数组和普通数组的访问方法一样

 <2> 循环访问(可以按照下标访问)

for(int i = 0; i < v.size(); i++){
    cout << v[i] << " ";//下标范围在[0,v.size()),前开后闭
}

 <3> 智能指针

for(auto i : v) {
    cout << i << " ";
}

2、方法函数

如何添加、删除、修改数据

相关的函数如下:

下例中,v指代为数组名

	v.front();               //返回第一个数据O(1) 
	v.back();                //返回最后一个数据O(1) 
	v.pop_back();            //删除最后一个数据O(1) 
	v.push_back(element);    //在数组尾部添加一个数据
	v.size();                //返回数组元素个数O(1)
	v.clear();               //清除数组
	v.resize(n,num);         //改变数组大小为n,n个空间数值赋值为num,默认为0 
	v.insert(it.num);        //向任意迭代器it插入一个元素x
	v.insert(c.begin()+2,-1);//将-1插入到v[2]的位置 
	v.erase(first,last);     //删除[first,last)的所有元素  
	v.begin();               //返回首元素的迭代器
	v.end();                 //返回最后一个元素的后一个位置的迭代器
	v.empty();               //判断是否为空,为空返回真,反之为假 

注: end()返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有容器均适用

3、注意事项

3.1、 排序

使用sort排序:

sort(v.begin(),v.end());

对所有元素排序,如果对指定区间进行排序,可以对sort()里面的参数进行修改

3.2、 访问

数组访问

<1> 下标访问

<2> 迭代器访问

vector<int> vi; //定义一个vi数组
vector<int>::iterator it = vi.begin();//声明一个迭代器指向vi的初始位置

//添加元素
for(int i = 0; i < 5; i++){
    vi.push_back(i);
}
	
	
//下标访问 
for(int i = 0; i < 5; i++){
    cout << vi[i] << " ";
}

<3> 智能指针

注:只能从头到尾遍历全部数组,如果要对指定内容进行遍历要选择其他方法

vector<int> v;
v.push_back(1);
v.push_back(2);
for( auto i : v) {
    cout << i << " "; // 1 2
}

总结:

  1. vi[i] 和 *(vi.begin() + i) 等价
  2. 说明:只有vectorstring的stl容器支持*(it + i)的元素访问
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值