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 <array>

定義和初始化 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 <iostream>
#include <array>
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 <iostream>
#include <array>
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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM