前言
本篇文章是C++ STL学习专栏的第二篇文章,也是教程的起点,希望能够通过一篇文章介绍一些常用的使用方法,解决小白在使用STL的烦恼。本篇文章将会介绍序列式容器array。简单来说,在序列容器中,元素的位置同元素的值无关,即容器是不排序的的,元素在什么指定位置插入就会存放在什么位置。如果已经有C++编译环境的小伙伴也可以直接到文章底部复制代码(代码可以直接运行,并且会覆盖本文所有内容,同时有详细的注释),进行编译,对照着结果和注释学习,可以自己动手改改,这样学起来效果更好,同时本文如果有什么错漏大家可以在评论区留言。
希望了解其他内容的可以点击底部的传送门进入STL学习专栏,目前仍在更新中!
array
简要介绍
array即数组容器,一旦建立,其长度是固定的,也就意味着它不能增加或删除元素,只能够改变某个元素的值;
构建array容器
array容器定义在<array>
头文件中,构建一个array容器的方法是array<class,size> name
,其中,class
是只数组中存的数据的数据类型,size
是指构建的容器的大小,name则是构建容器对象的名字。
下面将展示构建一个数据类型为整型,而大小为5的array容器
#include<iostream>
#include<array>
using namespace std;
int main()
{
array<int,5> a;
array<int,5> b ={1,2,3,4,5};
array<int,5> c {1,2,3,4,5};
array<int,5> d = b;
a.fill(1)//成员函数,将数组a的所有元素设置为1;
}
访问元素
array容器常用的访问方法主要有以下几种
- 以下标形式访问
- 使用
at()
访问,但相较于上一种方式,当i越界时,会给出std::out_of_range
的报错。 - 使用迭代器访问
- 使用其它成员函数访问特定位置,如第一个或者最后一个元素
a[i] //以下标访问
a.at(i)//等价于a[i],
arr.begin();//返回指向第一个元素的迭代器
arr.end();//返回指向队尾元素下一个元素的迭代器
arr.rbegin(); //返回指向最后一个元素的迭代器
arr.rend();//返回指向第一个元素前一个元素的迭代器
//成员函数访问:
arr.front();//返回第一个元素
arr.back();//返回最后一个元素
遍历
//使用下标
for(int i=0; i < a.size(); i++)
{
cout<<a[i]<<" ";
}
//使用迭代器正向迭代
auto first = a.begin();
auto last = values.end();
while (first != last)
{
cout << *first <<" ";
++first;
}
//使用迭代器反向迭代
auto first = a.rbegin();
auto last = values.rend();
while (first != last)
{
cout << *first << " ";
++first;
}
常用成员函数
成员函数 | 功能 |
---|---|
begin() | 返回指向容器中第一个元素的随机访问迭代器 |
end() | 返回指向容器最后一个元素之后一个位置的随机访问迭代器,通常和 begin() 结合使用。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上增加了 const 属性,不能用于修改元素。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
rbegin() | 返回指向最后一个元素的随机访问迭代器。 |
rend() | 返回指向第一个元素之前一个位置的随机访问迭代器。 |
crbegin() | 返回指向最后一个元素的随机访问迭代器。 |
crend() | 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 |
size() | 返回容器中当前元素的数量,其值始终等于初始化 array 类的第二个模板参数 N。 |
max_size() | 返回容器可容纳元素的最大数量,其值始终等于初始化 array 类的第二个模板参数 N。 |
empty() | 判断容器是否为空,和通过 size()==0 的判断条件功能相同,但其效率可能更快。 |
at(n) | 返回容器中 n 位置处元素的引用,该函数自动检查 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常。 |
front() | 返回容器中第一个元素的直接引用,该函数不适用于空的 array 容器。 |
back() | 返回容器中最后一个元素的直接引用,该函数同样不适用于空的 array 容器。 |
data() | 返回一个指向容器首个元素的指针。利用该指针,可实现复制容器中所有元素等类似功能。 |
fill(val) | 将 val 这个值赋值给容器中的每个元素。 |
array1.swap(array2) | 交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型。 |
可执行代码
下面展示一些 内联代码片
。
#include<iostream>
#include <iomanip>
#include<array>
using namespace std;
void show(array<int,5> &b)
{
for(int i = 0; i< b.size();i++){
cout<<b[i]<<" ";
}
cout<<endl;
}
int main()
{
/********************************构建array函数**********************************************/
array<int,5> a;
array<int,5> b ={1,2,3,4,5};
array<int,5> c {1,2,3,4,5};
array<int,5> d = b;
a.fill(1);//成员函数,将数组a的所有元素设置为1;
//输出查看
cout << "构建array函数"<<endl;
cout << setiosflags(ios::left)<<setw(30) <<"array<int,5> a; :";
show(a);
cout << setiosflags(ios::left)<<setw(30) <<"array<int,5> b ={1,2,3,4,5};";
show(b);
cout << setiosflags(ios::left)<<setw(30) <<"array<int,5> c {1,2,3,4,5};";
show(c);
cout << setiosflags(ios::left)<<setw(30) <<"array<int,5> d = b;";
show(d);
/********************************访问元素**************************************************/
cout<<endl<<endl<<setiosflags(ios::left)<<setw(30)<<b[2]<<endl; //以下标形式访问
cout<<setiosflags(ios::left)<<setw(30)<<b.at(2)<<endl; //以at()访问
//迭代器访问
auto begin1 = b.begin(); //返回指向第一个元素的迭代器
auto end1 = b.end(); //返回指向队尾元素下一个元素的迭代器
while (begin1 != end1) //输出查看
{
cout<< *begin1 << " ";
begin1++;
}
cout<<endl;
auto begin2 = b.rbegin(); //返回指向最后一个元素的反向迭代器
auto end2 = b.rend(); //返回指向第一个元素前一个元素的反向迭代器
while (begin2 !=end2)
{
cout<< *begin2 << " ";
begin2++;
}
//成员函数访问
cout << endl << b.front() << endl <<b.back()<<endl; //返回第一个元素与最后一个元素
/********************************遍历**************************************************/
/*
* 使用下标 可以看前面的show函数
* 使用迭代器正向 反向迭代 可以看前面的迭代器使用部分
*/
/********************************常用成员函数**************************************************/
//前面使用过的成员函数不在展示使用方法
//cbegin() cend() crebgin() crend() 含义以及使用方法与begin() end() rebgin() rend()一致,但是不允许通过其修改值
auto begin3 = b.cbegin();
cout << *begin3<<endl;//查看值
//*begin3 = 1; 取消注释后此处报错
int size = b.max_size();//查看容器的最大容量
cout << size <<endl;
bool empty = b.empty(); //查看容器的是否为空
cout << empty << endl;
a.swap(b); //a,与b的所有元素交换,需要满足他们具有相同的长度和类型
show(a);
show(b);
}