前言
一直觉得STL是C++最有利的武器之一,今天开个坑来学习一下。先从最好欺负 容易学的Array开始,fighting!
array简介
array内部其实是封装了一个简单的静态数组。并且在创建时就要确定数组的大小,在对象生命期结束前数组的长度都维持在这个大小。
如果需要使用这个容器,要在头文件中包含 #include < array > ,它也是在std命名空间里的。
using namespace std{
template <typename T, size_t N>
class array;
}
上面第一个参数就是数组元素的类型,第二个就是元素的个数。
功能
我们可以把它当成一个普通的数组看待,但是它拥有随机访问迭代器(random-access iterators),可以使用STL的算法。如果我们需要一个固定长度的数组,array拥有最好的性能,因为它分配在栈上(if possible),不会重新分配内存,并且可以随机访问。
初始化
array的构造函数由于模板第二个参数 size 决定了它是不会构造空容器的,总是会在构造时生成这么多的空间,并且要是没有元素参数传进来,初始化的数字不一定是0,接下来会有例子介绍。
1、无元素传入–值未定义
array<int,5> arr1;
for(auto i:arr1){
cout<<i<<endl;
}
结果瞬息万变,什么都有可能。
2 、0初始化
array<int,5> arr1 = {};
for(auto i:arr1){
cout<<i<<endl;
}
实际上是调用了 int() 。
3、用序列来初始化
array<int,5> arr1 = {3,1,2,3,4};
for(auto i:arr1){
cout<<i<<endl;
}
注意,若此时序列元素不够多,则后面的被初始化为 0。
但是若序列的元素数量超过array大小,则会报错。
还有一个情况,如下:
array没有如vector这样的构造器。
std::array<int,5> a({ 1, 2, 3, 4, 5, 6 }); // ERROR
std::vector<int> v({ 1, 2, 3, 4, 5, 6 }); // OK
总结如图
非修改操作
接下来是一些比较有用的操作,它们不会对数组本身造成修改。
//相等的
array<int,5> arr1 = {1,2,3};
array<int,5> arr = {1,2,3};
//不相等的且 arr1 > arr
array<int,5> arr1 = {3,2,1};
array<int,5> arr = {1,2,3};
swap
下面两种交换元素都是可以的。
c1.swap(c2);
swap(c1,c2);
迭代器
STL容器怎么能没迭代器呢,下面就是常见迭代器操作。
array<int,5> arr1 = {3,2,1};
array<int,5> arr = {1,2,3};
auto begin = arr1.begin();
cout<<*begin<<endl;//3
参考书籍
《C++标准库-自学教程与参考手册》