一、array
array<T,N> ,T:数据类型,N:固定的元素个数。
array与数组操作一样,都不能增加元素或者删除元素。
引入头文件
#include <array>
using namespace std;
创建数组容器
array<double,13> arr1; // 13个元素,初始值为随机值
array<double,13> arr2 = {}; // 13个元素,初始值为0
array<double,13> arr3 = {2.0, 1.3, 1.4} // 13个元素,初始值为2.0, 1.3, 1.4 ,后面10个都为0
arr1.fill(2.3333); // arr1全部赋值2.3333
fill(arr2.begin()+1,arr2.end(),4); // arr2 = {0,4,4,4,…,4}
fill_n(arr2.begin()+1,3,4); // arr2 = {1,4,4,4,0,0,…,0}
fill与fill_n函数
fill
fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(first,last,val); //first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值。
fill_n
fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val。把从起始点开始依次赋予count个元素val的值。
注意:不能在没有元素的空容器上调用fill_n函数,count可以大于容器的大小。
fill_n(arr2.begin()+1,15,4); // arr2 = {0,4,4,4,…,4}
vector<double> arr3;
fill_n(arr3.begin()+1,15,4); //错误的,arr3为空
array的访问
arr[idx] //返回索引idx所标示的元素,不进行范围检查, *(arr+idx),越界后当作指针处理(普通数组也是一样)。
arr.at(idx) //返回索引idx所标示的元素,如果越界,抛出range-error
arr.front() //返回第一个元素,不检查第一个元素是否存在
arr.back() //返回最后一个元素,不检查最后一个元素是否存在
上面的访问可以看出,数组是不安全的,array相对安全。
array的开销比标准数组大一点,但具有两个优点。
1.如果使用 at(),当用一个非法的索引访问数组元素时,能够被检测到,因为容器知道它有多少个元素,这也就意味着数组容器可以作为参数传给函数,而不再需要单独去指定数组元素的个数。
2.支持迭代器访问、获取容量、获得原始指针等高级功能。
ps:array不会退化成指针,数组在作为函数的形参,数组会退化成指针,所以无法获得数组大小,需要传递数组的大小。
#include <iostream>
#include <array>
using namespace std;
void printArray(double arr[]){
cout << sizeof(arr)/sizeof(arr[0]) << endl;
}
void printArray(array<double,13> arr){
cout << sizeof(arr)/sizeof(arr[0]) << endl;
}
int main(){
array<double,13> arr1 = {};
double arr2[13] = {};
printArray(arr1); // 13
printArray(arr2); // 1
return 0;
}
array的比较与运算符操作
arr1 == arr2 //arr1与arr2对应元素相等,返回true
arr1 != arr2 //arr1与arr2对应元素一个或多个不相等,返回true
arr1 <= arr2 //arr1与arr2对应元素进行字典序列比较
arr1 >= arr2 //arr1与arr2对应元素进行字典序列比较
arr1 = arr2 //将arr2所有元素赋值给arr1
arr1 = rv //将右值对象rv的所有元素移动赋值给arr1
arr1.fill(val) //将val赋值给数组arr1里的每个元素
arr1.swap(arr2) //交换arr1和arr2的数
swap(arr1,arr2) //交换arr1和arr2的数
ps:两个array必须具备相同类型,即元素类型和大小必须相同。
array的遍历
小贴士:
想要拷贝元素:for(auto x:range)
想要修改元素:for(auto &&x:range)
想要只读元素:for(const auto& x:range)
迭代器的使用
c.begin() //返回一个随机存取迭代器,指向第一个元素
c.end() //返回一个随机存取迭代器,指向最后一个元素
c.cbegin() //返回一个随机存取常迭代器,指向第一个元素
c.cend() //返回一个随机存取常迭代器,指向最后一个元素
c.rbegin() //返回一个逆向迭代器,指向逆向迭代的第一个元素
c.rend() //返回一个逆向迭代器,指向逆向迭代的最后一个元素
c.crbegin() //返回一个逆向常迭代器,指向逆向迭代的第一个元素
c.crend() //返回一个逆向常迭代器,指向逆向迭代的最后一个元素
ps:常迭代器(指向常量的迭代器),不能修改其指向的内容。