STL序列容器——array

一、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:常迭代器(指向常量的迭代器),不能修改其指向的内容。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值