C++ STL - Array

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值