使用 array


如果需要线性、长度不变的数据容器,可以使用array,这需要包含array标头文件:

#include <array>

技术上来说,array是个类模版(class template),不过使用上,只需要知道,array可以装载指定类型的数据。例如,创建长度为 5,可装载intarray<int, 5>

array<int, 5> number;

如同原生数组,number每个索引地址的初值是不可预期的,若想在创建容器时装载指定的元素,可以使用清单初始化化(list initialization)或者初始化器(Initializer):

array<int, 3> id = {0};    // 全部初始化为 0
array<int, 3> number = {10, 20, 30};
array<double, 3> score{85.5, 78.2, 63.0};

想要顺序地遍历array中的元素,可以使用 for range 语法,例如:

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

int main() {
    array<int, 3> number = {10, 20, 30};

    for(auto n : number) {
        cout << n << endl;
    }

    return 0;
}

透过[]指定索引可以访问特定位置的元素,例如:

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

int main() {
    array<int, 3> number = {10, 20, 30};

    for(int i = 0; i < number.size(); i++) {
        cout << number[i] << endl;
    }

    return 0;
}

可以从arraysize方法得知元素的个数,empty方法可以得知是否为空,front方法可以获取第一个元素,back方法可以获取最后一个元素,fill方法可以将各元素内容设为指定值。

array可以使用另一个array作为实参来构造,例如以a1作为实参来构造a2

array<int, 3> a1 = {10, 20, 30};
array<int, 3> a2(a1);

这会将a1的元素复制给被指定的a2array可以指定给另一array,这也会将array的元素复制给被指定的array,例如:

array<int, 3> a1 = {10, 20, 30};
array<int, 3> a2 = a1;

若要指定来源vector的某个范围构造出新的vector,必须指定起始位置的iterator与结束位置的iterator,例如底下从索引 2 开始遍历至尾端的元素,用以创建新的vector

vector<int> v1 = {10, 20, 30, 40, 50};
vector<int> v2(v1.begin() + 2, v1.end()); // 包含 30, 40, 50

array具有beginend方法,分别返回起始位置的array<int, LENGTH>::iterator与结束位置的array<int, LENGTH>::iterator,可以把它们看成代表首个元素与最后一个元素的位置,对它们进行+-运算,表示元素的位移量,操作上很像指针,至于是不是真的指针,要看底层的实现而定。

就 API 的设计来说,不建议将beginend方法的返回值看成是指针,而建议将之看成迭代器(iterator),这些迭代器重载了相关的运算符,令其看来像是指针操作,因为容器相关的程序库,为基于这类操作协定,令提供的 API 具有通用性。

若要使用迭代器来遍历元素,例如,先前的 for range 语法,若要使用beginend方法,可以搭配for循环,例如:

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

int main() {
    array<int, 3> number = {10, 20, 30};

    for(array<int, 5>::iterator it = number.begin();
        it != number.end();
        it++) {
        auto n = *it;
        cout << n << endl;
    }

    return 0;
}

如果打算对array进行排序、寻找、反转等操作,可以使用包含algorithm标头文件:

#include <algorithm>

一些操作会使用到迭代器,例如下面这个程序直接示范了排序、寻找、反转等操作:

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

int main() { 
    array<int, 6> number = {30, 12, 55, 31, 98, 11};

    // 排序 
    sort(number.begin(), number.end());
    for(auto n : number) {
        cout << n << " ";
    }
    cout << endl;

    cout << "输入搜寻值:";
    int search = 0;
    cin >> search;

    array<int, 6>::iterator it = find(number.begin(), number.end(), search);
    cout << (it != number.end() ? "找到" : "没有")
         << "搜寻值" 
         << endl;

    // 反转 
    reverse(number.begin(), number.end());
    for(auto n : number) {
        cout << n << " ";
    }
    cout << endl;

    return 0; 
}

执行结果:

11 12 30 31 55 98
输入搜寻值:12
找到搜寻值
98 55 31 30 12 11




展开阅读全文