C++array容器用法解析,它与普通数组究竟有何不同?

📋 前言

  • 🖱 博客主页:在下马农的碎碎念
  • ✍ 本文由在下马农原创,首发于CSDN
  • 📆 首发时间:2022/01/19
  • 📅 最近更新时间:2022/01/19
  • 🤵 此马非凡马,房星本是星。向前敲瘦骨,犹自带铜声。
  • 📇 系列文章目录: 暂无
  • 🙏作者水平有限,如发现错误,请留言轰炸哦!万分感谢!
  • 🤗码字不易 欢迎关注🔎点赞👍收藏⭐️留言📝

在这里插入图片描述

五岁时,妈妈告诉我,人生的关键在于快乐。上学后,人们问我长大了要做什么,我写下“快乐”。他们告诉我,我理解错了题目,我告诉他们,他们理解错了人生。——约翰·列侬

在这里插入图片描述

在这里插入图片描述

以下是正文

🔥1、array介绍

在C++标准库中,array是固定大小的序列容器,array中包含特定个数并且严格按照线性序列排序的元素。因此array允许对元素进行随机访问,指向某一元素的指针可以通过偏移访问其他元素。在array内部,它只保存自己包含的元素,其他任何信息都不保存,包括自身的大小。

array是C++ 标准模板库的一部分,因此,想要使用array,需要在程序中包含头文件array

 #include <array> 

🔥 2、array定义和初始化

格式:
包含头文件array之后,我们可以使用下边的格式定义array:

std::array<object_type,size> variable_name;

object_type规定了array中可以存放哪种类型的元素。
size为array的大小。
variable_name为array名。

方式: 定义array的常用方式如下所示:

std::array<int, 5> n;
std::array<int, 5> n = {1, 2, 3, 4, 5};
std::array<int, 5> n { {1, 2, 3, 4, 5} };

💻示例代码💻


🔥3、array的迭代器

array中的迭代器包括以下几个,分别为:

  • array.begin():指向array首元素的迭代器
  • array.end():指向array尾元素下一个位置的迭代器
  • array.rbegin():指向array尾元素的反向迭代器,即rbegin()指向尾元素,rbegin-1指向倒数第二个元素
  • array.rend():指向array头元素前一个位置的反向迭代器,即rend()指向头元素前一个位置元素,rbegin-1指向第一个元素
  • array.cbegin():指向array首元素的迭代器
  • array.cend():指向array尾元素下一个位置的迭代器
  • array.crbegin():指向array尾元素的反向迭代器
  • array.crend():指向array头元素前一个位置的反向迭代器

array容器的迭代器其实和vector容器的迭代器用法相同:
专门画了一张示意图,清晰展示各个迭代器:

代码示例如下:

💻示例代码💻

#include <array>
#include <iostream>

using std::array;
using std::cout;
using std::endl;

int main() {
    array<int, 5> myarray = {1, 2, 3, 4, 5};
    cout << "初始化后array为: ";
    for (auto num : myarray) {
        cout << num << " ";
    }
    cout << endl;

    // array.begin()为指向array头元素的迭代器
    auto begin_iterator = myarray.begin();
    cout << "begin() 指向的元素:" << *begin_iterator << endl;

    // array.end()为指向array尾元素后一个位置的迭代器,则myarray.end()-1指向尾元素
    auto end_iterator = myarray.end();
    cout << "end()-1 指向的元素:" << *(end_iterator - 1) << endl;

    // array.rbegin()为指向尾元素的迭代器,即反向(r)的头(begin)迭代器
    auto rbegin_iterator = myarray.rbegin();
    cout << "rbegin() 指向的元素:" << *rbegin_iterator << endl;

    // array.rend()为指向头元素的前一个位置的迭代器,即反向(r)尾(end)迭代器,则myarray.rend()-1指向头元素
    auto rend_iterator = myarray.rend();
    cout << "rend()-1 指向的元素:" << *(rend_iterator - 1) << endl;

    // array.cbegin()为指向array头元素的const迭代器,与begin()不同的是返回迭代器类型为array<int>::const_iterator
    auto cbegin_iterator = myarray.cbegin();
    cout << "cbegin() 指向的元素:" << *cbegin_iterator << endl;

    // array.cend()为指向array尾元素下一个位置的const迭代器,与end()不同的是返回迭代器类型为array<int>::const_iterator
    auto cend_iterator = myarray.cend();
    cout << "cend()-1 指向的元素:" << *(cend_iterator-1) << endl;

    // array.crbegin()为指向尾元素的const迭代器,即反向(r)的const(c)头(begin)迭代器
    auto crbegin_iterator = myarray.crbegin();
    cout<<"crbegin() 指向的元素: "<< *crbegin_iterator<<endl;

    // array.crend()为指向头元素下一个位置的const迭代器,即反向(r)的const(c)尾(end)迭代器
    auto crend_iterator = myarray.crend();
    cout<<"crend()-1 指向的元素: " << *(crend_iterator-1)<<endl;
}

📄输出📄

初始化后array为: 1 2 3 4 5
begin() 指向的元素:1
end()-1 指向的元素:5
rbegin() 指向的元素:5
rend()-1 指向的元素:1
cbegin() 指向的元素:1
cend()-1 指向的元素:5
crbegin() 指向的元素: 5
crend()-1 指向的元素: 1

🔥4、array大小(容量)相关方法

🍓4.1 size()——元素个数

要想知道array中有多少元素,使用array.size()方法,作用是返回array中元素的个数。示例如下:

💻示例代码💻

#include <iostream>
#include <array>
using std::cout;
using std::endl;
using std::array;

int main() {
    array<int,5> myarray = {1,2,3,4,5};
    
    cout << "初始化后的myarray为:";
    for (auto num : myarray) {
        cout<<num<<" ";
    }
    int sizeOfArray = myarray.size();
    cout<<"\nmyarray中的元素个数为:"<< sizeOfArray;    
}

📄输出📄

初始化后的myarray为:1 2 3 4 5
myarray中的元素个数为:5

🍓4.2 max_size()——最多能容纳元素个数:

要想知道array最多可以有多少元素,使用array.max_size()方法,作用是返回array中最多能容纳元素个数。在array容器中,array中最多能容纳的元素个数即为array中实际元素个数,因为array容器固定,不可以扩展或者收缩。示例如下:

💻示例代码💻

#include <iostream>
#include <array>
using std::cout;
using std::endl;
using std::array;

int main() {
    array<int,5> myarray = {1,2,3,4,5};
    cout << "初始化后的myarray为:";
    for (auto num : myarray) {
        cout<<num<<" ";
    }
    int sizeOfArray = myarray.max_size();
    cout<<"\nmyarray.size为:"<< sizeOfArray; 
    int max_sizeOfArray = myarray.max_size();
    cout<<"\nmyarray.max_size为:"<< max_sizeOfArray;    
}

📄输出📄

初始化后的myarray为:1 2 3 4 5
myarray.size为:5
myarray.max_size为:5

🍓4.3 empty()——检查array是否为空

想要检查array是否为空,使用array.empty()方法,如果为空返回true,否则返回false。示例如下:

💻示例代码💻

#include <array>
#include <iostream>
using std::array;
using std::cout;
using std::endl;

int main() {
    array<int, 5> myarray = {1, 2, 3, 4, 5};
    array<int, 0> myarray2;
    cout << "初始化后的myarray为:";
    for (auto num : myarray) {
        cout << num << " ";
    }
    cout << "\n初始化后的myarray2为:";
    for (auto num : myarray2) {
        cout << num << " ";
    }
    bool isEmpty = myarray.empty();
    bool isEmpty2 = myarray2.empty();
    cout << "\nmyarray.empty() = " << isEmpty << endl;
    cout << "myarray2.empty() = " << isEmpty2 << endl;
}

📄输出📄

初始化后的myarray为:1 2 3 4 5
初始化后的myarray2为:
myarray.empty() = 0
myarray2.empty() = 1

🔥5、array常用操作

🍓5.1 at()——访问array元素

使用元素的索引来访问array中的元素,在array中,可以使用array.at(index)或者array[index]访问索引为index的元素,示例代码如下:

💻示例代码💻

#include<iostream>
#include<array>

using std::endl;
using std::cout;
using std::array;

int main() {
    array<int,5> myarray = {1,2,3,4,5};
    
    cout<< "myarray索引为0的元素: "<< myarray.at(0) << endl;
    cout<< "myarray索引为1元素: "<< myarray.at(1) << endl;
    cout<< "myarray索引为2元素: "<< myarray[2] << endl;
    return 0;
}

📄输出📄

myarray索引为0的元素: 1
myarray索引为1元素: 2
myarray索引为2元素: 3

🔱两种访问方法的优劣🔱
虽然使用 array.at(index)array[index]的方式都能访问索引为index的元素,但是,如果此元素不存在,即索引越界时, array.at(index)会抛出一个异常,但是array[index]会返回一个垃圾值,因此,最好使用array.at(index),在其他容器中也是这样。

🍓5.2 front()——访问array头元素

front()返回array第一个元素

示例如下:

#include <array>
#include <iostream>
using std::array;
using std::cout;
using std::endl;

int main() {
    array<int, 5> myarray = {1, 2, 3, 4, 5};

    cout << "初始化后的myarray为:";
    for (auto num : myarray) {
        cout << num << " ";
    }
    int front = myarray.front();
    cout << "\nmyarray中的第一个元素为:" << front;
}

📄输出📄

初始化后的myarray为:1 2 3 4 5
myarray中的第一个元素为:1

🍓5.3 back()——访问array尾元素

front()返回array最后一个元素

示例如下:

#include <array>
#include <iostream>
using std::array;
using std::cout;
using std::endl;

int main() {
    array<int, 5> myarray = {1, 2, 3, 4, 5};

    cout << "初始化后的myarray为:";
    for (auto num : myarray) {
        cout << num << " ";
    }
    int back = myarray.back();
    cout << "\nmyarray中的最后一个元素为:" << back;
}

📄输出📄

初始化后的myarray为:1 2 3 4 5
myarray中的最后一个元素为:5

🍓5.4 data()——返回指向array中第一个元素的指针

使用array.data()会返回指向array中第一个元素的指针,因为array中元素线性排列,则可以使用data()的偏移来访问array中其他的元素。示例如下:

💻示例代码💻

#include <iostream>
#include <array>
using std::cout;
using std::endl;
using std::array;

int main() {
    array<int,5> myarray = {4,3,1,2,6};
    
    cout << "初始化后的myarray为:";
    for (auto num : myarray) {
        cout<<num<<" ";
    }
    int *sizeOfArray = myarray.data();
    cout<<"\nmyarray中第一个元素为:"<< *sizeOfArray;    
    cout<<"\nmyarray中第二个元素为:"<< *(sizeOfArray+1);    
    cout<<"\nmyarray中第五个元素为:"<< *(sizeOfArray+4);    
}

📄输出📄

初始化后的myarray为:4 3 1 2 6
myarray中第一个元素为:4
myarray中第二个元素为:3
myarray中第五个元素为:6

🍓5.5 fill(n)——使用n填充array

可以使用array.fill(n)来填充array,执行的结果是数组中的元素都变为n。示例如下:

💻示例代码💻

#include <iostream>
#include <array>
using std::cout;
using std::endl;
using std::array;

int main() {
	// 定义一个array,未初始化
    array<int,5> myarray;
    myarray.fill(2);
    cout << "fill(2)后的myarray为:";
    for (auto num : myarray) {
        cout<<num<<" ";
    }
    myarray.fill(5);
    cout << "\nfill(5)后的myarray为:";
    for (auto num : myarray) {
        cout<<num<<" ";
    }
}

📄输出📄

fill(2)后的myarray为:2 2 2 2 2
fill(5)后的myarray为:5 5 5 5 5

🍓5.6 swap()——交换两个array容器中的元素

可以使用swap()来交换两个array中的元素,前提是两个array容器中存储的元素类型以及元素个数都相同 。示例如下:

💻示例代码💻

#include <array>
#include <iostream>
using std::array;
using std::cout;
using std::endl;

int main() {
    array<int, 5> myarray1 = {1, 2, 3, 4, 5};
    array<int, 5> myarray2 = {11, 22, 33, 44, 55};

    cout << "初始化后的myarray1为:";
    for (auto num : myarray1) {
        cout << num << " ";
    }
    cout << "\n初始化后的myarray2为:";
    for (auto num : myarray2) {
        cout << num << " ";
    }
    myarray1.swap(myarray2);
    cout << "\n交换元素后myarray1为:";
    for (auto num : myarray1) {
        cout << num << " ";
    }
    cout << "\n交换元素后myarray2为:";
    for (auto num : myarray2) {
        cout << num << " ";
    }
}

📄输出📄

初始化后的myarray1为:1 2 3 4 5
初始化后的myarray2为:11 22 33 44 55
交换元素后myarray1为:11 22 33 44 55
交换元素后myarray2为:1 2 3 4 5

🔥6、array容器和数组的区别与联系

联系:

  • 都使用连续空间存储元素,可以进行随机访问
  • 元素个数都固定

区别:

  • 数组是不安全的,array是比较安全的,array避免访问越界
  • array提供了更好的数据访问机制,即可以使用front()和back()以及at()访问方式,使得访问更加安全。而数组只能通过下标访问,在写程序中很容易出现越界的错误
  • array容器支持迭代器,访问遍历更加方便
  • array提供了size()和Empty(),而数组只能通过sizeof()/strlen()以及遍历计数来获取大小和是否为空
  • 66
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下马农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值