array 容器

array 容器是 C++ 11 标准中新增的序列容器,简单地理解,它就是在 C++ 普通数组的基础上,添加了一些成员函数和全局函数。在使用上,它比普通数组更安全(原因后续会讲),且效率并没有因此变差。

和其它容器不同,array 容器的大小是固定的,无法动态的扩展或收缩,这也就意味着,在使用该容器的过程无法借由增加或移除元素而改变其大小,它只允许访问或者替换存储的元素。

array 容器以类模板的形式定义在 <array> 头文件,并位于命名空间 std 中,如下所示:

namespace std{
    template <typename T, size_t N>
    class array;
}

array 容器有多种初始化方式

std::array<double, 10> values;

std::array<double, 10> values {}; //所有的元素初始化为 0 或者和默认元素

std::array<double, 10> values {0.5,1.0,1.5,,2.0};

array容器成员函数汇总

成员函数功能
begin()返回指向容器中第一个元素的随机访问迭代器。
end()返回指向容器最后一个元素之后一个位置的随机访问迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的随机访问迭代器。
rend()返回指向第一个元素之前一个位置的随机访问迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上增加了 const 属性,不能用于修改元素。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size()返回容器中当前元素的数量,其值始终等于初始化 array 类的第二个模板参数 N。
max_size()返回容器可容纳元素的最大数量,其值始终等于初始化 array 类的第二个模板参数 N。
empty()判断容器是否为空,和通过 size()==0 的判断条件功能相同,但其效率可能更快。
at(n)返回容器中 n 位置处元素的引用,该函数自动检查 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常。
front()返回容器中第一个元素的直接引用,该函数不适用于空的 array 容器。
back()返回容器中最后一个元素的直接应用,该函数同样不适用于空的 array 容器。
data()返回一个指向容器首个元素的指针。利用该指针,可实现复制容器中所有元素等类似功能。
fill(val)将 val 这个值赋值给容器中的每个元素。
array1.swap(array2)交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和类型。

实例

#include <iostream>
#include <string>
#include <chrono>
#include <random>
#include <array>

using namespace std;

#define DN_ARRAY_SIZE			50000

int get_a_target_long()
{
	long target = 0;
	cout << "target (0-" << RAND_MAX << "):";
	cin >> target;
	return target;
}

string get_a_target_string()
{
	long target = 0;
	cout << "target (-0" << RAND_MAX << "):";
	cin >> target;
	return std::to_string(target);
}

void test_array()
{
	cout << "test_array()......................................" << endl;

	array<long, DN_ARRAY_SIZE> arr;

	//获取当前时间点
	chrono::steady_clock::time_point start = chrono::steady_clock::now();

	std::random_device rd;
	std::default_random_engine random(rd());
	//随机数范围 [0, DN_ARRAY_SIZE]
	uniform_int_distribution<int> dis(0, DN_ARRAY_SIZE);

	for (long i = 0; i < DN_ARRAY_SIZE; i++)
	{
		arr[i] = dis(random);
	}

	chrono::steady_clock::time_point last = chrono::steady_clock::now();
	//间隔
	chrono::nanoseconds dt = last - start;
	//转换成毫秒
	cout << "milli-seconds : " << chrono::duration_cast<chrono::milliseconds>(dt).count() << endl;
	cout << "array.size()= " << arr.size() << endl;
	cout << "array.front()= " << arr.front() << endl;
	cout << "array.back()= " << arr.back() << endl;
	cout << "array.data()= " << arr.data() << endl;

	long target = get_a_target_long();

	start = chrono::steady_clock::now();
	sort(arr.begin(), arr.end());
	bool bFind = binary_search(arr.begin(), arr.end(), target);
	last = chrono::steady_clock::now();
	dt = last - start;
	cout << "sort() + binary_search(), milli-seconds: " << chrono::duration_cast<chrono::milliseconds>(dt).count() << endl;
	if (bFind)
	{
		cout << "found, " << target << endl;
	}
	else
	{
		cout << "not found!" << endl;
	}
}

int main()
{
	test_array();


	return 0;
}

VS2017 Array源码

template<class _Ty,
	size_t _Size>
	class array
	{	// fixed size array of values
public:
	using value_type = _Ty;
	using size_type = size_t;
	using difference_type = ptrdiff_t;
	using pointer = _Ty *;
	using const_pointer = const _Ty *;
	using reference = _Ty&;
	using const_reference = const _Ty&;

	using iterator = _Array_iterator<_Ty, _Size>;
	using const_iterator = _Array_const_iterator<_Ty, _Size>;
    
	_NODISCARD constexpr size_type size() const noexcept
		{	// return length of sequence
		return (_Size);    //直接返回常量
		}

	_Ty _Elems[_Size];    //里面就是一个数组
	};

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值