STL(一)array静态数组

26 篇文章 0 订阅

C++ STL(标准模板)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件 描述
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

std::array

 
定义于头文件  <array>
  
模板类:template<class _Ty,size_t _Size>class array{};template<class _Ty>class array<_Ty, 0>{};// zero size array of values

成员类型

成员类型 定义
value_type T[编辑]
size_type std::size_t[编辑]
difference_type std::ptrdiff_t[编辑]
reference value_type&[编辑]
const_reference const value_type&[编辑]
pointer value_type*[编辑]
const_pointer const value_type*[编辑]
iterator 随机访问迭代器 (RandomAccessIterator字面类型 (LiteralType(C++17 起)[编辑]
const_iterator 常随机访问迭代器字面类型 (LiteralType(C++17 起)[编辑]
reverse_iterator std::reverse_iterator<iterator>[编辑]
const_reverse_iterator std::reverse_iterator<const_iterator>[编辑]

成员函数

隐式定义的成员函数
(构造函数)
(隐式声明)
遵循聚合初始化的规则初始化 array (注意默认初始化可以导致非类的 T 的不确定值) (公开成员函数)
(析构函数)
(隐式声明)
销毁 array 的每个元素 (公开成员函数)
operator=
(隐式声明)
以来自另一 array 的每个元素重写 array 的对应元素 (公开成员函数)
元素访问
at
访问指定的元素,同时进行越界检查 (公开成员函数)[编辑]
访问指定的元素 (公开成员函数)[编辑]
  
访问第一个元素 (公开成员函数)[编辑]
访问最后一个元素 (公开成员函数)[编辑]
返回指向内存中数组第一个元素的指针 (公开成员函数)[编辑]
迭代器
返回指向容器第一个元素的迭代器 (公开成员函数)[编辑]
返回指向容器尾端的迭代器 (公开成员函数)[编辑]
返回一个指向容器最后一个元素的反向迭代器 (公开成员函数)[编辑]
返回一个指向容器前端的反向迭代器 (公开成员函数)[编辑]
容量
检查容器是否为空 (公开成员函数)[编辑]
返回容纳的元素数 (公开成员函数)[编辑]
返回可容纳的最大元素数 (公开成员函数)[编辑]
操作
以指定值填充容器 (公开成员函数)[编辑]
交换内容 (公开成员函数)[编辑]

非成员函数

按照字典顺序比较 array 中的值 (函数模板)[编辑]
template <size_t I, class T, size_t N> T& get (array<T,N>& arr) noexcept;
template <size_t I, class T, size_t N> T&& get (array<T,N>&& arr) noexcept;
template <size_t I, class T, size_t N> const T& get (const array<T,N>& arr) noexcept;

访问array的一个元素 
(函数模板)[编辑]
特化 std::swap 算法 (函数模板)[编辑]

帮助类

获得array的大小 (类模板特化)[编辑]
template <size_t I, class Tpl> class tuple_element;   // unspecialized
template <size_t I, class T, size_t N>
  struct tuple_element <I, array<T,N>>;               // array specialization
示例:
#include<iostream>
#include<array>
#include<iterator>
#include <ctime>
#include <algorithm>
using namespace std;

#define N 10
int main()
{
	srand(time(0));
	array<int, N>a1{ { 1, 2, 3,4,5,6} };
	array<int, 3>a2 = { 10, 20, 30 };

	array<int, N>a3;

	//at函数索引、遍历
	for (int i = 0; i < N; i++)
	{
		a3.at(i) = rand() % 10;
	}

	//assign和fill,void fill( const T& value );将给定值value赋值给容器中所有的元素
	//a3.assign(2);
	//a3.fill(8);

	sort(a3.begin(), a3.end());

	//常规遍历
	for (int i = 0; i < a3.size(); i++)
	{
		cout<<a3.at(i)<<" ";
	}
	cout << endl;

	//利用迭代器(指针)遍历
	array<int,N>::iterator iter = a3.begin();
	for (; iter != a3.end();)
		cout << *iter++<<" ";
	cout << endl;

	//数组排序
	sort(a3.begin(), a3.end());


	array<int, N>::reverse_iterator iter1 = a3.rbegin();
	for (; iter1 < a3.rend();)
		cout << *iter1++ << " ";
	cout << endl;
	//或
	for (auto iter1 = a3.rbegin(); iter1 != a3.rend();)
		cout << *iter1++ << " ";
	cout << endl;

	cout << "array size:" << a3.size() << "  "
		<< "array max_size:" << a3.max_size() << endl;

	//访问指定的元素
	cout << a3.at(1) << endl;
	cout << a3[2] << endl;
	cout << a3.front() << endl;
	cout << a3.back() << endl;
	cout << *(a3.data())<< endl;//指向底层元素存储的指针

	a3.swap(a1);//元素个数必须相同
	//利用迭代器(指针)遍历
	array<int, N>::iterator iter2 = a3.begin();
	for (; iter2 != a3.end();)
		cout << *iter2++ << " ";
	cout << endl;

	tuple<int, int, int> mm { 10, 20, 30 };
	tuple_element<0, decltype(mm)>::type mn;//把array中的10换成30
	//array头文件中重载了tuple_element和tuple_size方便和tuple交互  
	//交换myarray[0]和myarray[2]  
	mn = get<2>(a2);//取出mm中的30  
	get<2>(a2) = get<0>(a2);
	get<0>(a2) = mn;//把30赋值给第一个元素
	cout << "a3 :" << get<0>(a2) << endl;
	cout << "tuple:" << get<0>(mm)<< endl;


	system("pause");
	return 0;
}

Array使用优劣

  (1)array比数组更安全。它提供了opeartor[]与at()成员函数,后者将进行数组越界检查。  

  (2)与其他容器相似,array也有自己的迭代器,因此array能够更好地与标准算法库结合起来。

  (3)通过array::swap函数,可以实现线性时间内的两个数组内容的交换。

  另外,不像C-style数组,array容器类型的名称不会自动转换为指针。对于C++程序员来说,array要比C-style数组更好用。



复杂示例:

#include<iostream>
#include<array>
#include<iterator>
#include <ctime>
#include <algorithm>
#include<string>
using namespace std;

#define N 10
#define M 3

//一维遍历
template<typename T>
void Print(T arr)
{
	for (auto it = arr.begin(); it != arr.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}


//二维遍历
template<typename T>
void Print1(T arr)
{
	for (auto p = begin(arr); p != end(arr);p++ )
	{
		for (auto q = begin(*p); q != end(*p);)
		cout << *q++ << " ";

		cout << endl;
	}
	cout << endl;
	
}

template<typename T>
void Print2(T arr)
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			//cout << arr[i][j] << " ";
			//或
			cout << arr.at(i).at(j) << " ";
		}
		cout << endl;
	}
	cout << endl;
}





int main()
{
	srand(time(0));
	//二维数组
	array<array<int, M>, M> aa;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			aa[i][j] = rand() % 10;
		}
	}

	Print1(aa);
	Print2(aa);


	//指针类型
	array<int*, M> arr0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			arr0[i][j] = rand() % 10;
		}
	}
	Print(arr0);


	//字符串
	array<string, M> arrstr;
	for (int i = 0; i < M; i++)
	{
		arrstr[i] = "abcde";
	}
	Print(arrstr);

	//字符
	array<char, 3>arr1;
	for (int i = 0; i < M; i++)
	{
		arr1.at(i) = (char)rand() % 10;
	}
	Print(arr1);


	


	system("pause");
	return 0;
}



待续。。。。。















































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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HySmiley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值