模板类:template<class _Ty,size_t _Size>class array{};template<class _Ty>class array<_Ty, 0>{};// zero size array of values 成员类型
成员函数
隐式定义的成员函数 |
| 遵循聚合初始化的规则初始化 array (注意默认初始化可以导致非类的 T 的不确定值) (公开成员函数) |
| 销毁 array 的每个元素 (公开成员函数) |
| 以来自另一 array 的每个元素重写 array 的对应元素 (公开成员函数) | 元素访问 |
| 访问指定的元素,同时进行越界检查 (公开成员函数)[编辑] |
| 访问指定的元素 (公开成员函数)[编辑] |
| 访问第一个元素 (公开成员函数)[编辑] |
| 访问最后一个元素 (公开成员函数)[编辑] |
| 返回指向内存中数组第一个元素的指针 (公开成员函数)[编辑] | 迭代器 |
| 返回指向容器第一个元素的迭代器 (公开成员函数)[编辑] |
| 返回指向容器尾端的迭代器 (公开成员函数)[编辑] |
| 返回一个指向容器最后一个元素的反向迭代器 (公开成员函数)[编辑] |
| 返回一个指向容器前端的反向迭代器 (公开成员函数)[编辑] | 容量 |
| 检查容器是否为空 (公开成员函数)[编辑] |
| 返回容纳的元素数 (公开成员函数)[编辑] |
| 返回可容纳的最大元素数 (公开成员函数)[编辑] | 操作 |
| 以指定值填充容器 (公开成员函数)[编辑] |
| 交换内容 (公开成员函数)[编辑] | 非成员函数
| 按照字典顺序比较 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;
}
待续。。。。。 |