C++ STL之 vector(动态数组)详解

1.简介

1.1 数组初始化方法

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

在局部函数中开vector数组,是在堆空间里面开的,与开全局变量比较类似,所以经常见到在局部函数中开大容量数组。

    1.头文件

#include < vector >

    2.初始化

  • 一维初始化
vector<int>num; //定义了一个名为num的存int数据的一维数组
vector<double>num;//定义了一个名为num的存double数据的一维数组
vector<node>num;//node是结构体类型

1.指定长度初始值的初始化

vector<int> v(n);//定义一个长度为n的数组,动态定义,不指定初值默认初值为0
vector<int> v(n, 0);//所有的元素均为0
//注意:指定数组长度之后(指定长度后的数组就相当于正常的数组了)

2.初始化中有多个元素

vector<int> a({1, 2, 3, 4, 5});// 数组a中有五个元素
vector<int> a = {1, 2, 3, 4, 5};
vector<int> a = vector<int>({1, 2, 3, 4, 5});

3.拷贝初始化

vector<int> a(n + 1, 0);
vector<int> b(a);//两个数组中的类型必须相同,a和b都是长度为n+1,所有值都为0的数组
vector<int> b(a.bedin(), a.end());

4.类内初始化

错误
class Foo(){
private:
	vector<string> name(5); //error in these 2 lines
	vector<int> val(5,0);// error
}

C++11之前,构造函数后初始化成员
class Foo {
private:
    vector<string> name;
    vector<int> val;
 public:
  Foo() : name(5), val(5,0) {}
};
C++11之后等于或花括号内用vector<int>(5,0)初始化
class Foo(){
private:
    vector<string> name = vector<string>(5);
    vector<int> val{vector<int>(5,0)};
}

  • 二维初始化

1.定义第一维固定长度为5,第二维可变化的二维数组

vector<int>num[5];//定义可变长二维数组
//注意:行是不可变的(只有5行),而列可变可以在指定行添加元素
//第一维固定长度为5,第二维长度可以改变

2.行列均可变

//初始化二维均可变长数组
vector<vectot<int> >num;//定义一个行和列均可变的二维数组

3.行列长度均固定 n + 1行 m + 1列初始值为0

vector<vector<int> > a(n + 1, vector<int>(m + 1, 0));

1.2元素的访问方法

//方式一:单个访问,假设num数组中已经有了5个元素
cout << num[4] << "\n";  //输出第五个数据
//一二维可变数组和普通数组的访问方法一样

//方式二:遍历
for(int i = 0; i < num.size(); i++)
	cout << num[i] << " ";//下标范围在[0,num.size()),前开后闭

//方式三:智能指针,只能遍历完数组,如果要指定的内容进行遍历,需要另选方法。
for(auto i : num)
	cout << i << " ";

二维数组自定义排序

1.bool表达式

//对 二维vector<vector> points中第二个元素进行排序
 static bool cmp(const vector<int>& a,const vector<int>& b){
    return a.back()<b.back();
 }
sort(points.begin(),points.end(),cmp);

 //二维vector按照第一个元素进行升序排序,如果第一个元素相等,则按照第二个元素进行降序排序。
 static bool cmp(const vector<int>& a,const vector<int>& b){
    return a[0]< b[0] || a[0]= b[0] && a[1] > b[1];
 }
sort(points.begin(),points.end(),cmp);

2.拉姆达表达式

//
sort(points.begin(),points.end(),[](vector<int>a, vector<int>b){return a[1]<b[1];}
//速度比方法1稍慢
// return a[0]<b[0] 实现二维数组中第一个关键字的排序

2. 接口函数

学习了怎么初始化可变数组后,下面是一些函数接口用来对数组进行增删改查等操作

代码含义时间复杂度
a.front()返回第一个数据O(1)
a.back()返回最后一个数据 O(1)
a.pop_back()删除最后一个数据 O(1)
a.push_back(element)在尾部加一个数据O(1)
a.size()返回实际数据个数(unsigned类型)O(1)
a.clear()清除元素个数O(N),N为元素个数
a.resize(n,v)改变数组大小为n,n个空间数值赋为v,如果没有默认赋值为0
a.insert(it,x)向任意迭代器it插入一个元素xO(N)
例:a.insert(c.begin()+2,-1)将-1插入c[2]的位置
a.erase(first,last)删除[first,last)的所有元素
a.begin()返回首元素的迭代器(通俗来说就是地址)
a.end()返回最后一个元素后一个位置的迭代器(地址)
a.empty()判断是否为空,为空返回真,反之返回假

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

3.其他

3.1. 排序

使用sort排序要: sort(a.begin(),a.end());

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

3.2. 访问

数组访问:

下标法: 和普通数组一样

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

注意:一维数组的下标是从0到a .size() - 1,访问之外的数可能会出错


迭代器法: 类似指针一样的访问 ,首先需要声明迭代器变量,和声明指针变量一样

代码如下:

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

迭代器访问:

vector<int>::iterator it;   
//相当于声明了一个迭代器类型的变量it,通俗来说就是声明了一个指针变量

//方式一:
vector<int>::iterator it = vi.begin(); 
for(int i = 0; i < 5; i++)
	cout << *(it + i) << " "; // vi[i] 和 *(vi.begin() + i) 等价
cout << "\n";

//方式二:
vector<int>::iterator it;
for(it = vi.begin(); it != vi.end();it ++)
	cout << *it << " ";
//vi.end()指向尾元素地址的下一个地址

注:只有vectorstring的stl容器支持*(it + i)的元素访问,vi[i] 和 *(vi.begin() + i) 等价

  • 11
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值