10.6.1 std::array
建议先复习《语言》篇中“STL常用类型”中和 std::array 相关的内容。
boost::scope_array 更多地用于对C++程序采用在堆中分配的原生数组来实现自动管理(重点就是在超出生存区时,自动释放)。
std::vector 提供对连续内存的更多管理,包括分配,扩大,缩小(逻辑上);另外 std::vector 是一个标准的“容器”,提供了对应的迭代器类型。
如果不需要在程序运行时才动态决定数组大小,更不需要在程序运行时改变数组容量大小,那么,我们要的是一个最简单的栈数组:
//写代码时,编译时就决定这个数组是10个元素
int a[10];
std::array 就用来代替普通栈数组。
栈数组有个特性,叫“数组退化”。
std::array的例子:
#include <array>
void test_boost_array()
{
std::array<int, 10> i10a;
std::cout << i10a.size() << endl; //10
// std::cout << std::array<int, 10>::size() << endl;
}
std::array是一个严格的静态数组,而size()则是类型的静态成员。std::array可以方便地使用[ ]和下标,随机访问每个元素:
for(int i = 0; i < 10; i++)
{
i10a[i] = 10 + i;
}
也可以用迭代器访问:
typedef std::array<int, 10> IArray10;
for(IArray10::const_iterator it= i10a.begin()
; it != i10a.end(); ++ it)
{
cout << *it << "\t";
}
类似vector的at(index)函数也存在,并且同样附加了越界检查功能,越界时将抛出异常。
std::array也提供了empty() 函数, 同样静态成员:
static bool empty();
除非我们一开始定义的是一个大小为0的 array 对象,否则通过 std::array 对象调用empty(),总是返回 false,它的存在只是为了让 std::array 可以更好地参与标准库的基于容器的算法。
高效低耗啊! std::array 看着远处舞台上风光的 std::vector,心里暗自说:“人们都说我在模仿他,其实我要做一个和它不同的数组!”
std::array还提供了front()和back()两个函数,方便得到数组的最前头元素和最后头的元素。再加上size(),empty()等操作,array 比 vector 高效,比原生数组安全和方便,做C++语言中有个性的数组类型,它做到了。