C++11——std::array


std::array<> 是在 c++11 中引入的,它是旧 C 风格数组的包装器,具有额外的优势。
它是一种具有恒定大小元素的顺序容器。

std::array 内部定义为类模板,即

template < class T, size_t N > 
class array;

这里第一个模板参数 T 是要存储在数组中的元素类型,第二个模板参数即
size_t N 是一个常数,表示数组中元素的数量。

std::array 所需的头文件即

#include 

定义和初始化 std::array<> 对象

std::array<int, 10> arr;

此处,std::array 对象 arr 表示一个固定大小为 10 且未初始化的 int 数组,因此所有 10 个元素都包含垃圾值。

std::array < std::string, 200 > arr1;

这里,std::array 对象 arr1 表示一个固定大小为 200 的字符串数组。

// 前 2 个值将被初始化,其他值为 0。
std::array < int , 10 > arr3 = { 34, 45 } ;

如果我们在初始化期间提供较少数量的元素,则剩余的将使用默认值进行初始化。就像 int 为 0 的情况一样。所以, arr3 包含,

34, 45, 0, 0, 0, 0, 0, 0, 0,

std::array 还提供了一个成员函数 fill() 来一次性为所有元素设置相同的值。当我们有大数组时很容易。

std::array<int, 10> arr4;
// Fill all elements in array with same value
arr4.fill(4);

所以,arr4 包含

4,4,4,4,4,4,4,4,4,4
#include 
#include 
void printArray(std::array<int, 10>& arr)
{
    // Printing array
    for (auto& elem : arr)
        std::cout << elem << " , ";
    std::cout << std::endl;
}
int main()
{
    // Uninitialized array object contains elements with
    // garbage values
    std::array<int, 10> arr1;
    printArray(arr1);
    // Initialized array object
    std::array<int, 10> arr2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    printArray(arr2);
    // First 2 values will be initialized and others will be 0.
    std::array<int, 10> arr3 = { 34, 45 };
    printArray(arr3);
    std::array<int, 10> arr4;
    // Fill all elements in array with same value
    arr4.fill(4);
    printArray(arr4);
    return 0;
}

如何获取 std::array 的大小

std::array 对象的大小始终是常量,即它的第二个模板参数。但是,std::array 提供了一个成员函数 size() 来返回大小即

// Returns the constant size
arr.size();

如何访问 std::array 中的元素

有 3 种方法可以访问 std::array 中的元素

// 创建并初始化一个大小为 10 的数组。
std::array < int , 10 > arr = { 1,2,3,4,5,6,7,8,9,10 } ;

运算符 []:使用运算符 [] 访问 std::array 中的元素

int x = arr [ 2 ] ;

使用 [] 运算符访问超出范围的元素将导致未定义的行为。

at() : 使用 at() 成员函数访问 std::array 中的元素

// Accessing element using at() function
int x = arr.at(2);

使用 at() 函数访问任何超出范围的元素将抛出out_of_range异常。

std::tuple 的 get<>()

int x = std::get < 2 >( arr ) ;

使用 get<> 运算符访问超出范围的元素将导致编译时错误。

完整的例子如下,

#include 
#include 
int main()
{
    // Creating and initializing an array of size 10.
    std::array<int, 10> arr = { 1,2,3,4,5,6,7,8,9,10 };
    // Random access operator [] to fetch any element from array
    int x = arr[2];
    std::cout << "x = " << x << std::endl;
    // Accessing out of range elements using [] leads to undefined behaviour
    // i.e. it can give garbage value or crash
    x = arr[12];
    std::cout << "x = " << x << std::endl;
    // Accessing element using at() function
    x = arr.at(2);
    std::cout << "x = " << x << std::endl;
    // Accessing out of range elements using at() will throw exception
    try
    {
        x = arr.at(12);
    }
    catch (const std::out_of_range& exp)
    {
        std::cerr << exp.what() << std::endl;
    }
    // Accessing elements from std::array object using std::get<>()
    x = std::get<2>(arr);
    // Accessing out of range elements using std::get<>() will throw error at compile time
    //x = std::get<12>(arr);
    std::cout << "x = " << x << std::endl;
    return 0;
}

Output:

x = 3
x = -927490112
x = 3
array::at: __n (which is 12) >= _Nm (which is 10)
x = 3