C++数组和容器vector基础理解

一、数组

C++中的数组是一种用于存储相同数据类型的元素的数据结构。
每种数据结构都具有一些特点,我们假设用“班级”这种组织的形式来简单阐述数组的特点

  • 固定大小:数组一旦声明,其大小通常是固定的,不能在运行时动态更改。就好比开设了一个30人的班级,班级大小已经固定,不能再改变班级的规模。
  • 相同数据类型: 数组中的所有元素必须具有相同的数据类型,假设这个班都是男生或者都是女生,只能有一种性别存在。
  • 连续存储: 数组的元素在内存中是连续存储的,班级里的同学按照顺序就坐,中间没有留空位。
  • 下标访问:数组中的元素通过下标(索引)进行访问,每个人都有一个学号,学号就是自己的座位,这个学号被称为索引,但是数组里的索引是从0开始的,也就是说,第一个元素的索引是0,第二个元素的索引是1,依次类推。

1.1 声明数组

那具体如何在C++中定义和使用数组呢?C++中声明数组的方式为:

dataType arrayName[arraySize]

  • dataType表示数组元素的类型,比如int、double、char等。
  • arrayName是为数组指定的名称,类似于变量名称。
  • arraySize是数组的大小,即它可以容纳多少个元素。
// 声明一个包含5个整数的数组
int myArray[5];

1.2 初始化数组

C++中使用大括号 {} 初始化数组的元素,也可以逐个赋值。

int arr[5] = {1,2,3,4,5};//大括号赋值
int arr2[3];//逐个赋值
arr2[0] = 1;
arr2[1] = 2;
arr2[3] = 3;

如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。

int arr[ ] = {1,2,3,4,5}; 等价于 int arr[5] = {1,2,3,4,5};

1.3 访问数组元素

使用循环结构,如 for 循环,可以遍历数组中的所有元素。

for (int i = 0; i < 5; i++) {
    cout << arr[i] << " ";
}

⚠️ 需要注意的是,C++中的数组没有提供自动的长度信息,因此在处理数组时必须小心,以避免访问越界的元素。
int a = arr[5]; // 数组长度为5,索引范围为0-4,如果尝试访问arr[5],会越界访问数组范围,导致程序运行出错

1.4 倒序隔空输出数组

  • 倒序:下标从n-1开始递减遍历
  • 隔空:每隔一个元素输出其值,中间用空格分隔,只需要对数组从索引为0的位置进行遍历,每次递增2,中间输出空格,这样就能保证输出索引为0、2、4、……位置的元素
#include<iostream>
using namespace std;
int main()
{
    int n;//定义数组长度
    cin >> n;
    int arr[n];//声明一个大小为n的数组
    
    //输入数组元素
    //遍历数组
    for(int i = 0;i < n;i++)//输入数组元素
    {
        cin >> arr[i];
    }
    for(int i = n-1;i >= 0;i--)//倒序输出
    {
        cout<<arr[i]<<" ";
    }
    cout << endl;
    for(int i = 0;i < n; i+=2)//隔空输出
    {
        cout<<arr[i]<<" ";
    }
    return 0;
}

1.5 int arr[n]说明

对于传统的C++编译器,创建具有可变长度的数组是不允许的。在C++中,数组的大小必须是常量表达式,也就是在编译时已知的值。

但是,从C++11开始,引入了一个新特性称为变长数组(Variable Length Arrays,VLA)。变长数组允许在运行时动态确定数组的大小。根据C++11标准,这是一个可选的特性,并不是所有编译器都支持它。

因此,如果您使用的是支持VLA的编译器,并且将其设为 C++11 或更高版本,那么创建具有变长的数组是允许的,例如:

int n = 5;
int arr[n];

但是需要注意的是,VLA并不是C++标准的一部分,并且在某些编译器中可能不受支持或存在限制。此外,使用变长数组可能会导致栈溢出的风险,因为内存分配是在运行时进行的。

因此,建议在编写代码时,尽可能使用动态内存分配的方式,例如使用 new 运算符或 std::vector 等容器来代替变长数组。

综上所述,是否允许创建具有变长的数组取决于您使用的编译器和C++版本。如果您使用的编译器不支持VLA,那么创建具有变长数组会导致编译错误。

二、容器vector

⚠️ 因为要输入变量,才能确定数组的大小,属于不清楚元素的确切个数,理应使用vector,上面的代码示例是为了展示数组操作,暂时这样演示,实际上int
arr[n]这种操作是不被允许的,并且在编译器中可能会报错。

如果不清楚元素的确切个数,请使用vector

数组的长度是固定的,但是我们往往并不知道一组数据的大小,这个时候再使用数组就会显得很麻烦,而vector (被称为容器),做为C++ 标准库中的一个容器类,表示对象的集合,它可以动态地存储一组元素,所以你可以根据需要轻松地调整 vector 的大小。

和输入输出类似,如果想要使用vector, 必须包含头文件vector

#include <vector>

2.1 vector创建方式

容器的创建方式为

vector<类型> 名称

无需指明长度

vector<int> myVector; // 创建一个空vector, 元素是int类型的

除此之外,还有一些别的创建方式,常见的有

vector<int> myVector = {1, 2, 3, 4, 5}; // 创建一个包含整数元素的容器并初始化元素

vector<int> myVector(10); // 创建一个包含10个元素的容器,元素为int类型(值被系统默认初始化为0)

vector<int> myVector(10, -1); // 创建一个包含10个重复元素的容器,每个元素的值都是-1

2.2 vector常用内置方法

我们已经知道,vector可以动态调整大小,这种调整是通过vector内置的方法push_back动态添加元素来实现的。

push_back()负责将一个值push(推送)到vector中的back(尾端)

vector<int> myVector = {1, 2, 3, 4, 5};
myVector.push_back(6); // 往容器的最末端添加数字6

与数组类似,仍然可以使用下标操作符 [ ] 访问 vector 中的元素

int value = myVector[0]; // 获取第一个元素的值,即 1

还可以使用内置的size()方法来获取容器当前的元素数量

int size = myVector.size(); // 获取vector的大小

在数组中,我们通过for循环完成了对数组的遍历,vector 遍历的方式是一样的。

for (int i = 0; i < myVector.size(); i++) {
    cout << myVector[i] << " "; // 从索引为0开始,遍历到i等于size的时候退出循环,完成整个遍历
}

2.3 vector实现倒序和隔空

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n;//定义数组大小
    int num;
    vector<int> myvector ;
    cin >> n;
    for(int i=0;i<n;i++)//推入元素
    {
        cin>>num;
        myvector.push_back(num);
    }
    for(int i = myvector.size()-1;i >=0;i--)//倒序输出
    {
        cout<<myvector[i]<<" ";
    }
    cout << endl;
    for(int i = 0;i < myvector.size(); i+=2)//隔空树春
    {
        cout<<myvector[i]<<" ";
    }
    return 0;
}
  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值