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]; //里面就是一个数组
};