STL序列式容器array(含完整可执行代码)

前言

本篇文章是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);
}

STL学习专栏传送门

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值