112.STL中的array

发布时间 2023-07-22 14:49:25作者: CodeMagicianT

112.STL中的array

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头元素前一个位置的反向迭代器

代码示例如下:

#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;
    
    return 0;
}

输出:

初始化后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;
    return 0;
}

输出:

初始化后的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;

    return 0;
}

4.3empty()——检查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;

    return 0;
}

输出:

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

5.array常用操作

5.1at()——访问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.2front()——访问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;

    return 0;
}

输出:

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

5.3back()——访问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;

    return 0;
}

输出:

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

5.4data()——返回指向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);

    return 0;
}

输出:

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

5.5fill(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 << " ";
    }

    return 0;
}

输出:

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

5.6swap()——交换两个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 << " ";
    }

    return 0;
} 

输出:

初始化后的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()以及遍历计数来获取大小和是否为空

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