📋 前言
- 🖱 博客主页:在下马农的碎碎念
- ✍ 本文由在下马农原创,首发于CSDN
- 📆 首发时间:2022/01/19
- 📅 最近更新时间:2022/01/19
- 🤵 此马非凡马,房星本是星。向前敲瘦骨,犹自带铜声。
- 📇 系列文章目录: 暂无
- 🙏作者水平有限,如发现错误,请留言轰炸哦!万分感谢!
- 🤗码字不易 欢迎关注🔎点赞👍收藏⭐️留言📝
五岁时,妈妈告诉我,人生的关键在于快乐。上学后,人们问我长大了要做什么,我写下“快乐”。他们告诉我,我理解错了题目,我告诉他们,他们理解错了人生。——约翰·列侬
以下是正文
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头元素前一个位置的反向迭代器
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()以及遍历计数来获取大小和是否为空