array 类(C++ 标准库)
描述了一个对象,此对象控制类型 Ty 的元素的长度序列 N。 此序列存储为 Ty 的数组,包含在 array<Ty, N> 对象中。
语法:
template <class Ty, std::size_t N>
class array;
示例:
#include<array>
#include<iostream>
using namespace std;
#define LENGTH 15
typedef array<int, LENGTH> Myarr; //声明 array 对象
int main(void)
{
array<int, 5> myarr1{11,3,45,6,22}; //声明和 初始化
Myarr arr{};
for (size_t i = 0; i < LENGTH; i++)
{
arr[i] = rand() % 100; //随机数初始化数组
}
//C++ 11 语法auto遍历
for (auto i : myarr1)
{
cout << i << ' ';
}
cout.put('\n');
for (auto i : arr)
{
cout << i << ' ';
}
cout.put('\n');
cout << "迭代器遍历方法:" << endl;
for_each(arr.begin(), arr.end(), [=](int i) {cout << i << ' '; }); //使用 Lambda
cout.put('\n');
for (auto ib = arr.begin(), ie = arr.end(); ib != ie; ib++)
{
cout << *ib << ' ';
}
cout.put('\n');
//多维数组
cout << "二维数组" << endl;
array<Myarr, 3> arr2;
//初始化
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < LENGTH; j++)
{
arr2[i][j]= rand() % 100; //随机数初始化数组
}
}
for (auto i : arr2)
{
for (auto j : i)
{
cout << j << " ";
}
cout.put('\n');
}
cout.put('\n');
for (auto ib_i = arr2.begin(), ie_i = arr2.end(); ib_i != ie_i; ib_i++)
{
for (auto ib_j = (*ib_i).begin(), ie_j = (*ib_i).end(); ib_j != ie_j; ib_j++)
{
cout << *ib_j << ' ';
}
cout.put('\n');
}
cout.put('\n');
return 0;
}
array 成员:
类型定义 | 描述 |
---|---|
const_iterator | 受控序列的常量迭代器的类型。该类型描述可用作受控序列的常量随机访问迭代器的对象。 |
const_pointer | 元素的常量指针的类型。该类型描述了可用作指向序列中元素的常量指针的对象。 |
const_reference | 元素的常量引用的类型。 |
const_reverse_iterator | 受控序列的常量反向迭代器的类型。 |
iterator | 受控序列的迭代器的类型 |
指针 (pointer) | 指向元素的指针的类型。 |
reference | 元素的引用的类型。 |
reverse_iterator | 受控序列的反向迭代器的类型。 |
size_type | 两个元素间的无符号距离的类型。 |
value_type | 元素的类型。 |
#include<array>
#include<iostream>
using namespace std;
typedef array<double, 5> Douarr;
int main(void)
{
Douarr c1{ 1.2,1.5,2.3,66.0,5.68 };
cout << "array:: const_iterator: (受控序列的常量迭代器的类型。)" << endl;
cout << "it1:";
for (Douarr::const_iterator it0 = c1.begin(); it0 != c1.end(); it0++)
{
cout << ' ' << *it0;
}
cout << endl;
Douarr::const_iterator it1 = c1.begin();
Douarr::const_iterator it2 = c1.begin() + 1;
cout << typeid(it1).name() << " " << typeid(it2).name() << endl;//输出类型
cout << "it1: " << *it1 << endl;
cout << "it2: " << *it2 << endl;
cout << "array:: const_pointer (元素的常量指针的类型。)" << endl;
for (const auto& it : c1)
{
cout << " " << it;
}
cout << endl;
Douarr::const_pointer ptr = &*c1.begin();
cout << typeid(ptr).name() << endl;
cout << "ptr :" << *ptr << endl;
cout << "array:: const_reference (元素的常量引用的类型) " << endl;
Douarr::const_reference ref = *c1.begin();
cout << typeid(ref).name() << endl;//输出类型
cout << "ref: " << ref<<endl;
cout << "array:: const_reverse_iterator (受控序列的常量反向迭代器的类型。)" << endl;
//反向遍历
for (Douarr::const_reverse_iterator it1 = c1.rbegin(); it1 != c1.rend(); it1++)
{
cout << *it1 << " ";
}
cout << endl;
Douarr::const_reverse_iterator rit = c1.rbegin();
cout << typeid(rit).name() << endl;
cout << "rit: " << *rit << endl;
cout << "array::difference_type (两个元素间的带符号距离的类型。)" << endl;
Douarr::difference_type diff1 = c1.begin() - (c1.begin() + 1);
Douarr::difference_type diff2 = c1.begin() - c1.end();
Douarr::difference_type diff3 = c1.end() - c1.begin();
cout << typeid(diff1).name() << endl;//输出类型
cout << "diff1= " << diff1 << " diff2=" << diff2 <<" diff3="<<diff3<< endl;
cout << "array:: iterator (受控序列的迭代器的类型)" << endl;
Douarr::iterator itb = c1.begin();
cout << typeid(itb).name() << endl;//输出类型
*itb = 2.55;//改变值
*(itb + 2) = 10.5;
for (Douarr::iterator it = c1.begin(); it != c1.end(); it++)
{
cout << *it << " ";
}
cout << endl;
cout << "array::pointer (指向元素的指针的类型)" << endl;
Douarr::pointer ptr1 = &*c1.begin();
cout << typeid(ptr1).name() << endl;//输出类型
*ptr1 = 100.99;//改变值
*(ptr1 + 1) = 99.99;
size_t n = 0;
while (n<5)
{
cout << *(ptr1+n) << " ";
n++;
}
cout << endl;
cout << "array:: reference (元素的引用的类型)" << endl;
Douarr::reference ref1 = *c1.begin();
cout << typeid(ref1).name() << endl;//输出类型
ref1 += 100;
cout << "ref1 = " << ref1 << endl;
cout << "array:: reverse_iterator (受控序列的反向迭代器的类型)" << endl;
Douarr::reverse_iterator ritb = c1.rbegin();
cout << typeid(ritb).name() << endl;//输出类型
for_each(ritb, c1.rend(), [=](double n)
{
cout << n * 2 << " ";//反向输出且*2
}
);
cout << endl;
cout << "array:: size_type (两个元素间的无符号距离的类型)" << endl;
Douarr::size_type st1 = c1.end() - c1.begin();
Douarr::size_type st2 = c1.begin() - c1.end();
cout << typeid(st1).name() << endl;//输出类型
cout << "st1= " << st1 << " st2=" << st2 << endl;
Douarr::size_type st3 = ~st2;//取反
cout << "st3= " << st3 << endl;
cout << "array:: value_type (元素的类型)" << endl;
for (auto i:c1)
{
Douarr::value_type val = i;
cout <<typeid(val).name()<<" : "<< val << " | ";
}
cout << endl;
return 0;
}
array 成员函数:
成员函数 | 描述 |
---|---|
array | 构造一个数组对象。 |
assign | 弃用. (使用fill。)替换所有元素。 |
at | 访问指定位置处的元素。 |
back | 访问最后一个元素。 |
begin | 指定受控序列的开头。 |
cbegin | 返回一个随机访问常量迭代器,它指向数组中的第一个元素。一个常量随机访问迭代器,指向范围的第一个元素,或刚超出空范围末尾的位置(对于空范围, cbegin() == cend())。由于使用 cbegin 的返回值,因此不能修改范围中的元素。可以使用此成员函数替代 begin() 成员函数,以保证返回值为 const_iterator。 它一般与 auto 类型推导关键字联合使用。 |
cend | 返回一个随机访问常量迭代器,它指向刚超过数组末尾的位置。 |
crbegin | 返回一个指向反向数据中第一个元素的常量迭代器。 |
crend | 返回一个指向反向数组末尾的常量迭代器。 |
data | 获取第一个元素的地址。 |
empty | 测试元素是否存在。 仅当 N == 0 时,此成员函数才返回 true |
end | 指定受控序列的末尾。 |
fill | 将所有元素替换为指定值。 |
front | 访问第一个元素 |
max_size | 对元素数进行计数。 |
rbegin | 指定反向受控序列的开头。 |
rend | 指定反向受控序列的末尾。 |
size | 对元素数进行计数。 |
swap | 将此数组的内容交换到另一个数组 数组长度类型必须一致 |
示例:
#include<array>
#include<iostream>
using namespace std;
typedef std::array<int, 4> Myarray;
//成员函数
int main(void)
{
Myarray c0{ 11,32,12,23 };
cout << "array:: array (构造一个数组对象)" << endl;
Myarray c1(c0);
for (const auto& i : c1)
{
cout << i << " ";
}
cout << endl;
cout << "array:: assign (Obsolete in C++11,由 fill 替代。 替换所有元素)" << endl;
c1.fill(10);
for (const auto& i : c1)
{
cout << i << " ";
}
cout << endl;
cout << "array:: at (访问指定位置处的元素)" << endl;
cout << "at(1)= " << c0.at(1) << " at(3)= " << c0.at(3) << endl;
cout << "array:: back (访问最后一个元素)" << endl;
int n1 = c0.back();
cout << "c0.back()= " << n1 << endl;
cout << "array::front (访问第一个元素)" << endl;
int n2 = c0.front();
cout << "c0.front()= " << n2 << endl;
cout << "array:: cbegin AND array:: cend (常量迭代器)" << endl;
for (auto itcb = c0.cbegin(), itce = c0.cend(); itcb != itce; itcb++)
{
cout << *itcb << " ";
}
cout << endl;
cout << "array:: crbegin AND array:: crend (反向常量迭代器)" << endl;
array<int, 2> v1 = { 1, 2 };
array<int, 2>::iterator v1_Iter;
array<int, 2>::const_reverse_iterator v1_rIter;
v1_Iter = v1.begin();
cout << "The first element of array is "
<< *v1_Iter << "." << endl;
v1_rIter = v1.crbegin();
cout << "The first element of the reversed array is "
<< *v1_rIter << "." << endl;
cout << "反向遍历 array 对象 c0 " << endl;
for (auto itcrb = c0.crbegin(), itcre = c0.crend(); itcrb != itcre; itcrb++)
{
cout << *itcrb << " ";
}
cout << endl;
cout << "array::data (获取第一个元素的地址)" << endl;
Myarray::pointer ptr1 = c0.data();
cout << "ptr1 地址=" << ptr1 << " 值=" << *ptr1 << endl;
cout << "array:: empty (测试元素是否存在 返回 bool 值)" << endl;
bool b1 = c0.empty();//存在元素返回 false 反之 true
if (b1)
{
cout << "array c0 " << "is empty" << endl;
}
else
{
cout << "array c0 " << "is not empty" << endl;
}
cout << "array:: max_size AND array::size (对元素数进行计数) " << endl;
cout << "c0.max_size()= " << c0.max_size() << " c0.size()=" << c0.size() << endl;
Myarray c3;
cout << "c3.max_size()= " << c3.max_size() << " c3.size()=" << c3.size() << endl;
cout << "array:: swap (将此数组的内容交换到另一个数组)" << endl;
Myarray c4{ 0,1,2,3 }, c5{ 6,7,8,9 };
cout << "交换前:" << endl;
for (const auto& i : c4)
{
cout << i << " ";
}
cout << endl;
for (const auto& i : c5)
{
cout << i << " ";
}
cout << endl;
cout << "交换后:" << endl;
swap(c5, c4);//把
for (const auto& i : c4)
{
cout << i << " ";
}
cout << endl;
for (const auto& i : c5)
{
cout << i << " ";
}
cout << endl;
return 0;
}
array 测试Dome
//ArrayTest.h
#ifndef _ARRAYTEST_
#define _ARRAYTEST_
#define ASIZE 500000
namespace array_test_01
{
void Test_Array();
void array_Iterators();
}
//TestFunc.h
#ifndef _TESTFUNC_
#define _TESTFUNC_
#include<iostream>
using namespace std;
long Get_a_target_long();
string Get_a_target_string();
int compareLongs(const void* ptr1, const void* ptr2);
int compareStrings(const void* str1, const void* str2);
#endif // _TESTFUNC_
#include "TestFunc.h"
long Get_a_target_long()
{
long target(0);
cout << "target (0~" << RAND_MAX << " ):" << endl;
cin >> target;
return target;
}
string Get_a_target_string()
{
long target(0);
char buf[10]{ 0 };
cout << "target (0~" << RAND_MAX << " ):" << endl;
cin >> target;
snprintf(buf, 10, "%d", target);
return string(buf);
}
int compareLongs(const void* ptr1, const void* ptr2)
{
return (*(long*)ptr1) - (*(long*)ptr2);
}
int compareStrings(const void* str1, const void* str2)
{
if (*(string*)str1 > * (string*)str2)
{
return 1;
}
else if (*(string*)str1 < *(string*)str2)
{
return -1;
}
else
{
return 0;
}
}
#include "ArrayTest.h"
#include"TestFunc.h"
#include<iostream>
#include<array>
#include<ctime>
#include<cstdlib>
using namespace std;
array<long, ASIZE> arr{ 0 };//声明变量在静态区
void array_test_01::Test_Array()
{
cout << "Begin: Test_Array() ... ... ...\n" << endl;
clock_t timeStart = clock();
for (long i = 0; i < ASIZE; i++)
{
arr[i] = rand() % 0xFFFF;
}
cout << "初始化时间:" <<clock()-timeStart<< endl;
cout << "array 成员函数测试:" << endl;
cout << "获取第一个元素:array.front() - " << arr.front() << endl;
cout << "获取最后一个元素:array.back() - "<< arr.back() << endl;
cout << "获取数组大小:array.size() - " << arr.size() << endl;
cout << "获取数组首地址:array.data() - :" << arr.data() << endl;
long target = Get_a_target_long();
timeStart = clock();
qsort(arr.data(), ASIZE, sizeof(long), compareLongs);
long* ptr_Item = (long*)bsearch(&target, arr.data(), ASIZE, sizeof(long), compareLongs);
cout << "qsort() + bsearch() : 所用时间(毫秒)=" << (clock() - timeStart) << endl;
if (ptr_Item != nullptr)
{
cout << "Found ," << *ptr_Item << endl;
}
else
{
cout << "NO Found !" << endl;
}
}
void array_test_01::array_Iterators()
{
array<int,10> arr{ 1,2,3,4,5,6,7,8,9,0 };
for (auto ibegin = arr.begin(), iend = arr.end(); ibegin != iend; ibegin++)
{
cout << typeid(ibegin).name() <<" "<<*ibegin<< endl;
}
cout << "算法:" << "\n\n";
for_each(arr.begin(), arr.end(), [](int& i) {i += 1; });
for_each(arr.begin(), arr.end(), [](int& i) {cout << i << endl; });
}
#include"ArrayTest.h"
#include"VectorTest.h"
#include"ListTest.h"
#include<iostream>
using namespace std;
long size_vc = 0;
int main(void)
{
cout << "请输入测试序列:" << endl;
int temp = 0;
cin >> temp;
switch (temp)
{
case 1:
array_test_01::Test_Array();
//array_test_01::array_Iterators();
break;
case 2:
cout << "请输入元素个数:";
cin >> size_vc;
vector_test_01::Vector_test(size_vc);
case 3:
cout << "请输入元素个数:";
cin >> size_vc;
list_test_01::list_test(size_vc);
list_test_01::list_fun_test();
default:
break;
}
return 0;
}