112.STL中的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 = sizeof(myarray)/sizeof(int);
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()以及遍历计数来获取大小和是否为空