STL(一)array静态数组

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

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

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

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

std::array

 
  
定义于头文件 
   
模板类:templateclass array{};templateclass 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
访问指定的元素,同时进行越界检查 (公开成员函数)[编辑]
operator[]
访问指定的元素 (公开成员函数)[编辑]
front
   
访问第一个元素 (公开成员函数)[编辑]
back
访问最后一个元素 (公开成员函数)[编辑]
data
返回指向内存中数组第一个元素的指针 (公开成员函数)[编辑]
迭代器
begincbegin
返回指向容器第一个元素的迭代器 (公开成员函数)[编辑]
end cend
返回指向容器尾端的迭代器 (公开成员函数)[编辑]
rbegincrbegin
返回一个指向容器最后一个元素的反向迭代器 (公开成员函数)[编辑]
rendcrend
返回一个指向容器前端的反向迭代器 (公开成员函数)[编辑]
容量
empty
检查容器是否为空 (公开成员函数)[编辑]
size
返回容纳的元素数 (公开成员函数)[编辑]
max_size
返回可容纳的最大元素数 (公开成员函数)[编辑]
操作
fill
以指定值填充容器 (公开成员函数)[编辑]
swap
交换内容 (公开成员函数)[编辑]

非成员函数

operator==operator!=operatoroperator>=
按照字典顺序比较 array 中的值 (函数模板)[编辑]
std::get (std::array)
template  T& get (array& arr) noexcept;
template  T&& get (array&& arr) noexcept;
template  const T& get (const array& arr) noexcept;

访问array的一个元素 
(函数模板)[编辑]
std::swap (std::array)
(C++11)

 
          
特化 std::swap 算法 (函数模板)[编辑]

帮助类

std::tuple_size
获得array的大小 (类模板特化)[编辑]
std::tuple_element
template  class tuple_element;   // unspecialized
template 
  struct tuple_element >;               // array specialization
示例:
#include
#include
#include
#include 
#include 
using namespace std;

#define N 10
int main()
{
	srand(time(0));
	arraya1{ { 1, 2, 3,4,5,6} };
	arraya2 = { 10, 20, 30 };

	arraya3;

	//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<::iterator iter = a3.begin();
	for (; iter != a3.end();)
		cout << *iter++<<" ";
	cout << endl;

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


	array::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::iterator iter2 = a3.begin();
	for (; iter2 != a3.end();)
		cout << *iter2++ << " ";
	cout << endl;

	tuple 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
#include
#include
#include 
#include 
#include
using namespace std;

#define N 10
#define M 3

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


//二维遍历
template
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
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, 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 arr0;
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < M; j++)
		{
			arr0[i][j] = rand() % 10;
		}
	}
	Print(arr0);


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

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


	


	system("pause");
	return 0;
}



待续。。。。。















































你可能感兴趣的:(C/C++,C++)