元素访问

1. at(pos)

返回对 pos 位置元素的引用,并使用边界检查。如果 pos 不在容器的范围内,则抛出 std::out_of_range 类型的例外。

复杂性是常数 O(1)

#include <array>

int main()
{
    std::array<int, 3> arr;

    // write values
    arr.at(0) = 2;
    arr.at(1) = 4;
    arr.at(2) = 6;
        
    // read values
    int a = arr.at(0); // a is now 2
    int b = arr.at(1); // b is now 4
    int c = arr.at(2); // c is now 6

    return 0;
}

2)operator[pos]

返回对 pos 位置的元素的引用,不进行边界检查。如果 pos 不在容器的范围内,则可能发生运行时分段违规错误。此方法提供与经典数组等效的元素访问,并且比 at(pos) 更有效。

复杂性是常数 O(1)

#include <array>

int main()
{
    std::array<int, 3> arr;

    // write values
    arr[0] = 2;
    arr[1] = 4;
    arr[2] = 6;
        
    // read values
    int a = arr[0]; // a is now 2
    int b = arr[1]; // b is now 4
    int c = arr[2]; // c is now 6

    return 0;
}

3)std::get<pos>

非成员函数返回对编译时常量位置 pos 的元素的引用,而不进行边界检查。如果 pos 不在容器范围内,则可能发生运行时分段违例错误。

复杂性是常数 O(1)

#include <array>

int main()
{
    std::array<int, 3> arr;

    // write values
    std::get<0>(arr) = 2;
    std::get<1>(arr) = 4;
    std::get<2>(arr) = 6;
        
    // read values
    int a = std::get<0>(arr); // a is now 2
    int b = std::get<1>(arr); // b is now 4
    int c = std::get<2>(arr); // c is now 6

    return 0;
}

4)front()

返回对容器中第一个元素的引用。在空容器上调用 front() 是不确定的。

复杂性是常数 O(1)

注意: 对于容器 c,表达式 c.front() 相当于*c.begin()

#include <array>

int main()
{
    std::array<int, 3> arr{ 2, 4, 6 };

    int a = arr.front(); // a is now 2

    return 0;
}

5)back()

返回对容器中最后一个元素的引用。在空容器上调用 back() 是未定义的。

复杂性是常数 O(1)

#include <array>

int main()
{
    std::array<int, 3> arr{ 2, 4, 6 };

    int a = arr.back(); // a is now 6

    return 0;
}

6)data()

返回指向用作元素存储的基础数组的指针。指针使得 range [data(); data() + size()) 始终是有效范围,即使容器为空(在这种情况下 data() 不可解除引用)。

复杂性是常数 O(1)

#include <iostream>
#include <cstring>
#include <array>

int main ()
{
    const char* cstr = "Test string";
    std::array<char, 12> arr;
    
    std::memcpy(arr.data(), cstr, 12); // copy cstr to arr
    
    std::cout << arr.data(); // outputs: Test string
    
    return 0;
}