C++动态数组

普通数组

int a[100];    //True
int a[100][100];    //True
const int m = 5;
int a[m];    //TRue
int n = 6;
int a[n];    //Flase

一维动态数组

一维动态数组十分重要,很多题目都是给出总个数n,然后依次给出数组元素。

例如:

int n;
cin>>n; 
int *a = new int[n];   //True
//.....    //表示中间过程
delete []a;

多个一维动态数组

比如建立2个长度相同的动态数组

//方法一
int n;
cin>>n; 
int *a = new int[n]; 
int *b = new int[n]  
//.....    //表示中间过程
delete []a;
delete []b;
//方法二
int n;
cin>>n;
int (*a)[2] = new int[n][2];    //注意,括号不能省,否则devc++报错
//....
delete []a;

比如建立5个长度相同的动态数组。例如new int[a][5],其实质与new int[a]创建一个动态数组并无多大区别——只是元素类型由int变为了int[5]而已。

//方法二
int n;
cin>>n;
int (*a)[5] = new int[n][5];    //注意,括号不能省,否则devc++报错
//....
delete []a;

或者用const替换5, 方便更改数量。(比如后期想改为6,只需要改动一处)

//方法二
int n;
cin>>n;
const int m = 5;
int (*a)[m] = new int[n][m];    //注意,括号不能省,否则devc++报错
//....
delete []a;

建立二维动态数组

int n,m;
cin>>m>>n;
int **a = new int*[m];
for(int i=0; i<m; i++)
{
    a[i] = new int [n];
}

for(int i=0; i<m; i++)
{
    delete [] a[i];
}

delete[]a;

建立三维动态数组(同样的办法,三维动态数组一般不常用,这里只是介绍其扩展思想)

int n,m,t;
cin>>m>>n>>t;

int ***a = new int**[m];
for(int i=0; i<m; i++)
{
a[i] = new int *[n];
}

for(int i=0; i<m; i++)
{
    for(int j=0; j<n; j++)
    {
        a[i][j] = new int [t];
    }
}

可以看出,二维动态数组已经很麻烦,三维更加麻烦,那么有没有更好的办法呢?

这里就介绍一种常用的STL库vector(向量),刷过力扣的同学就会发现vector将会经常用到,其实vector底部构架也是用数组组成的,向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组

vector使用方法(数组进阶版)

//vector的定义
//引用头文件
#include <vector>

//vector<类型> 标识符
vector<int> a;

//二维动态数组用两个vector表示
vector<vector<int> >a;
//vector的使用方法
// 1.指定大小不带初值的初始化
vector<int> vec(9); // 大小为9,初始值不确定(对于int类型,一般默认为0)
// 2.直观的初始化
vector<int> vec{1,2,3,4,5,6,7,8};
// 3.批量初始化
int size=10;
vector<int> vec(size,1); // 容器vec大小为10,初始值为1

// 4.通过其他容器初始化
// 假设容器b为{1,2,3,4,5}
vector<int> vec(b); // 整个拷贝
vector<int> vec(b.begin()+n,b.begin()+m); // 局部拷贝,从b.begin()+n开始,赋值(m-n)个元素

// 5.通过数组初始化
// 注意不能直接拷贝整个数组!
int b[7]={6,5,4,3,2,1,0};
vector<int> vec(b+n,b+m); // 与上类似



//增加
// 假设容器vec为{4,3,2,1}
vec.push_back(0); // 像容器vec最后插入元素0,vec变成{4,3,2,1,0}

// 假设容器b为{4,3,2,1}
vec.assign(b.begin()+n,b.begin()+m); // 从b.begin()+n开始,拷贝(m-n)个元素
vec.assign(10,1); // 容器大小为10,初值为1



//删除
// 假设容器vec为{4,3,2,1}
vec.pop_back(); // 删除vec的最后一个元素1

// 假设容器vec为{4,3,2,1}
vec.erase(vec.begin()+1); // 删除索引为1的元素,vec变为{4,2,1}
//-------------------------------------------------------------------------
// 假设容器vec2为{4,3,2,1}
vec2.erase(vec2.begin()+n,vec2.begin()+m); // 从第n个元素开始,删除(m-n)个元素

// 假设容器vec为{4,3,2,1}
vec.clear(); //清空vec中的所有元素



//修改
// 假设容器vec为{4,3,2,1}
vec.resize(10); // 将容器vec大小调至10,会补充元素,值随机(一般为0)
// 假设容器vec2为{4,3,2,1}
vec2.resize(3); // 将容器vec2大小调至3,会删除元素,值随机(一般从末尾删除)
// 假设容器vec3为{4,3,2,1}
vec3.resize(10,2); // 将容器vec3大小调至10,补充元素,值指定为2



//翻转
// 假设容器vec为{4,3,2,1}
reverse(vec.begin(),vec.end()); // vec变为{1,2,3,4}



//查找
// 假设容器vec为{4,3,2,1}
vec.front(); //返回第一个元素4
vec.back(); // 返回最后一个元素1
// 假设容器vec为{4,3,4,2,1,0}

// 返回元素ele在vec中的第一个索引,ele为4时返回index=0
// 若未找到指定的元素,返回下标为vec.size()
int index=find(vec.begin(),vec.end(),ele)-vec.begin();

// 返回元素ele在vec中的第一个索引(从右往左看,索引也是从右开始),ele为4时返回index=3
// 若未找到指定的元素,返回下标为vec.size()
int index2=find(vec.rbegin(),vec.rend(),ele)-vec.rbegin();

// 假设容器vec为{4,3,2,1}
vec.empty(); //判断vec是否为空,空则返回true;不空则返回false

// 假设容器vec为{4,3,2,1,0}
vec.size() // 返回容器大小,值为5


//排序
vector<int> vec{7,5,9,2,4,1};
sort(vec.begin(),vec.end()); // 正常升序排序



//遍历
// 通过迭代器遍历
// 假设容器vec为{4,3,2,1}
vector<int>::iterator iter;
for(iter=vec.begin();iter!=vec.end();iter++) {
    cout<<*iter<<endl; // 注意是 *iter!
}

参考博客(52条消息) C++的vector用法详解!!!强大索引,一目了然,分分钟搞定!!!_vector c++ 用法_打代码的大肥羊的博客-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值