首页 > 其他分享 >112.STL中的array

112.STL中的array

时间:2023-07-22 14:56:24浏览次数:51  
标签:std cout STL 元素 myarray 112 using array

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容器用法解析,它与普通数组究竟有何不同?

标签:std,cout,STL,元素,myarray,112,using,array
From: https://www.cnblogs.com/codemagiciant/p/17573360.html

相关文章

  • 模拟ArrayList(顺序表)的底层实现
    模拟ArrayLIst的底层实现packagecom.tedu.api04.list;importjava.util.Objects;/***@authorLIGENSEN*Date:2023/7/2011:35*/publicclassArrayListDemo{publicstaticvoidmain(String[]args){ArrList<String>list=newArrList<>......
  • Array方法: indexOf、filter、forEach、map、reduce详解
    [array方法:indexof、filter、foreach、map、reduce详解|FEblog](https://007sair.github.io/2015/08/17/js-Extras/#map)ECMAScript5标准新增了几个数组操作的方法,让我们来看看都是什么:Array.prototype.indexOfArray.prototype.lastIndexOfArray.prototype.everyArray.......
  • 暑假对STL的学习用法
    mapmap<int,int>s;map<int,vector<int>>s;map<int,list<int>>s;这些就是map的初始化法子,前面那个就相当于数组下标,后面的就是键值了,可以用它搞二维数组就像第二三个一样。然后就是他的用处,他可以自动排序,但是是按照前面的key值排序,就是下标拉,不过看你怎么用这个东西,这......
  • [Javascript] [] is ArrayList
    Runthefollowingcode,foundthatfor get&push&pop,itisO(1)time;Butfor shift/unshfit,itisO(n)time.Inthiscases,Javascript's[],isaArrayList,everytimeyoudoshiftorunshiftitneedtomovetherestofitemsbyoneoffw......
  • Codeforces 1696G - Fishingprince Plays With Array Again
    初读题目可以发现一些性质:每次操作会使整个序列的和减少至多\(X+Y\),因此\(ans\ge\dfrac{\suma_i}{X+Y}\)。对于两个不相邻位置\(a_i,a_j(|i-j|>1)\),每次操作最多使它们的和减少\(\max(X,Y)\)。然后你发现两个限制可以结合在一起使用,稍加思考可以得到一个比较普适的结论:......
  • Whistle(基于Node实现的跨平台转包调试工具)的使用
    可抓包,可显示vconsolet调试一、安装npmi-gwhistle二、启动手机和电脑处于同一网络w2start--init浏览器打开地址:http://127.0.0.1:8899/三、配置Rules:https://testh.app.coc.10086.cnwhistle.inspect://vConsoleconsole安装插件: w2installwhistle.ins......
  • 洛谷 P1122 最大子树和 题解
    一道入门的树形DP。首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序、单调、子问题等等性质),以便于后续的转化、推理和处理。有序化可以“转化和创造”性质首先将视角从无根树切换为有根树,这样我们就可以得到一个带有最优子结构、无后效性......
  • [LeetCode] 2461. Maximum Sum of Distinct Subarrays With Length K
    Youaregivenanintegerarray nums andaninteger k.Findthemaximumsubarraysumofallthesubarraysof nums thatmeetthefollowingconditions:Thelengthofthesubarrayis k,andAlltheelementsofthesubarrayare distinct.Return themaxim......
  • docker compose报错environment array items[0,4] must be unique
    DockerCompose报错:environmentarrayitems[0,4]mustbeunique在使用DockerCompose进行容器编排时,有时候会遇到以下错误提示:environmentarrayitems[0,4]mustbeunique。这个错误发生在定义了重复的环境变量时,本文将详细解释这个错误的原因,并提供解决方案。DockerCompose......
  • LeetCode 852. Peak Index in a Mountain Array 二分
    Anarrayarramountainifthefollowingpropertieshold:arr.length>=3Thereexistssomeiwith0<i<arr.length-1suchthat:arr[0]<arr[1]<...<arr[i-1]<arr[i]arr[i]>arr[i+1]>...>arr[arr.length-......