关于stl:C-STL-array容器

7次阅读

共计 3811 个字符,预计需要花费 10 分钟才能阅读完成。

一、前言

array 容器是 C++ 11 规范中新增的序列容器,就是在 C++ 一般数组的根底上,增加了一些成员函数和全局函数。在应用上,它比一般数组更平安,且效率并没有因而变差。
和其它容器不同,array 容器的大小是固定的,无奈动静的扩大或膨胀,只容许拜访或者替换存储的元素。

二、详解

array 容器以类模板的模式定义在 <array> 头文件,并位于命名空间 std 中。因而,在应用该容器之前,代码中需引入 <array> 头文件,并默认应用 std 命令空间。即:

#include <array>
using namespace std;

在 array<T,N> 类模板中,T 用于指明容器中的存储的具体数据类型,N 用于指明容器的大小,N 必须是常量,不能用变量示意

1、初始化

① std::array<int, 10> values; 
② std::array<int, 10> values {};
③ std::array<double, 10> values {2,1,4,9};

以上都能够对 array 进行初始化,区别在于:
①各个元素的值是不确定的(array 容器不会做默认初始化操作)
②将所有的元素初始化为 0 或者和默认元素类型等效的值
③能够初始化一部分值,残余的均初始化值默认为 0

2、成员函数

成员函数 性能
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 容器中的所有元素,但前提是它们具备雷同的长度和类型

3、实例

1)初始化

// testArray.cpp : 此文件蕴含 "main" 函数。程序执行将在此处开始并完结。//

#include <iostream>
#include <array>
using namespace std;

int main()
{
    std::array<int, 5> arrayInt;
    std::array<int, 5> arrayInt2{};
    std::array<int, 5> arrayInt3{2,6,4,3};

    // 遍历 array 的值
    for (int i = 0; i < arrayInt.size(); i++) {std::cout << "输入 arrayInt[" << i << "]=" << arrayInt[i] << std::endl;
    }

    for (int i = 0; i < arrayInt2.size(); i++) {std::cout << "输入 arrayInt2[" << i << "]=" << arrayInt2[i] << std::endl;
    }

    for (int i = 0; i < arrayInt3.size(); i++) {std::cout << "输入 arrayInt3[" << i << "]=" << arrayInt3[i] << std::endl;;
    }
 
    system("pause");
    return 0;
}

后果如下:

2)begin()的应用

 std::array<int, 5>::iterator arrayIter = arrayInt.begin();
    std::cout << "输入 arrayInt begin:" << *arrayIter << std::endl;

后果如下:

3)rbegin()的应用

//rbegin()的应用
    std::array<int, 5>::reverse_iterator arrayRIter = arrayInt.rbegin();
    std::cout << "输入 arrayInt rbegin:" << *arrayIter << std::endl;

后果如下:

4)size()的应用

 //size()的应用
    std::cout << "输入 arrayInt size:" << arrayInt.size() << std::endl;

后果如下:

5)max_size()的应用

//max_size()的应用
    std::cout << "输入 arrayInt max_size:" << arrayInt.max_size() << std::endl;

后果如下:

6)at()的应用

//at()的应用
    std::cout << "输入 arrayInt at(3):" << arrayInt.at(3) << std::endl;
    try
    {std::cout << "输入 arrayInt at(6):" << arrayInt.at(6) << std::endl;
    }
    catch (const std::exception&)
    {std::cout << "at(6)操作异样" << std::endl;
    }

后果如下:

7)data()的应用

 //data()的应用
    int *pData = arrayInt.data();
    for (int i = 0; i < arrayInt.size(); i++)
    {std::cout << "输入 arrayInt[:" << i << "]=" << *pData++ << std::endl;
    }

后果如下:

8)fill()的应用

 //fill()的应用
    arrayInt.fill(8);
    for (int i = 0; i < arrayInt.size(); i++) {std::cout << "输入 arrayInt[" << i << "]=" << arrayInt[i] << std::endl;
    }

后果如下:

9)swap 的应用

 std::array<int, 5> arrayInt4;
    arrayInt.swap(arrayInt4);
    for (int i = 0; i < arrayInt4.size(); i++) {std::cout << "输入 arrayInt4[" << i << "]=" << arrayInt4[i] << std::endl;
    }

后果如下:

10)crbegin()的应用

 std::array<int, 5>::const_reverse_iterator arrayRe = arrayInt.crbegin();
    std::cout << "输入 arrayInt crbegin:" << *arrayRe << std::endl;

后果如下:

三、array 随机拜访迭代器

在 array 容器的模板类中,和随机拜访迭代器相干的成员函数有:
begin()
end()
rbegin()
rend()
cbegin()
cend()
crbegin()
crend()
具体的性能如下:

依据它们的性能并结合实际场景的须要,这些成员函数通常是成对应用的,即 begin()/end()、rbegin()/rend()、cbegin()/cend()、crbegin()/crend() 各自成对搭配应用,其中 begin()/end() 和 cbegin()/cend()、rbegin()/rend() 和 crbegin()/crend() 的性能大抵是雷同的。
留神:
在应用反向迭代器进行 ++ 或 — 运算时,++ 指的是迭代器向左挪动一位,– 指的是迭代器向右挪动一位,即这两个运算符的性能也“调换”了,即反向迭代器以逆序的形式解决元素。

四、array 容器拜访元素的几种形式

1、容器名[]

相似于 C ++ 中拜访数组元素的形式,须要留神的是:这种形式不会查看边界,所以能够存在索引越界的问题,因而不举荐应用这种办法。
重载 [] 时没有实现边界查看的起因:性能问题。每次拜访元素,都去查看索引值,会产生很多开销。

2、at()

为了无效防止越界拜访的问题,可应用 array 容器提供的 at()成员函数
如设置索引地位 4 的值:

values.at (4) = values.at(3) + 2*values.at(1);

当传给 at()的值是一盒越界值时,会抛出异样,为了防止程序解体,此处能够加异样机制解决。

3、data()

通过调用该函数能够失去指向容器首个元素的指针。通过该指针,咱们能够取得容器中的各个元素。示例代码中有,这里不再阐明

4、遍历容器

下面的办法是拜访单个元素的,如果要拜访容器中多个元素要怎么做呢?
首先能够通过 size()获取容器的大小,在遍历容器取出元素即可

正文完
 0