Recherche…


Paramètres

Paramètre Définition
class T Spécifie le type de données des membres du groupe
std::size_t N Spécifie le nombre de membres dans le tableau

Remarques

L'utilisation d'un std::array nécessite l'inclusion de l'en-tête <array> aide de #include <array> .

Initialisation d'un tableau std ::

Initialisation de std::array<T, N> , où T est un type scalaire et N le nombre d'éléments de type T

Si T est un type scalaire, std::array peut être initialisé des manières suivantes:

// 1) Using aggregate-initialization
std::array<int, 3> a{ 0, 1, 2 };
// or equivalently
std::array<int, 3> a = { 0, 1, 2 };

// 2) Using the copy constructor
std::array<int, 3> a{ 0, 1, 2 };
std::array<int, 3> a2(a);
// or equivalently
std::array<int, 3> a2 = a;

// 3) Using the move constructor
std::array<int, 3> a = std::array<int, 3>{ 0, 1, 2 };

Initialiser std::array<T, N> , où T est un type non scalaire et N est le nombre d'éléments de type T

Si T est un type non scalaire, std::array peut être initialisé des manières suivantes:

struct A { int values[3]; }; // An aggregate type

// 1) Using aggregate initialization with brace elision
// It works only if T is an aggregate type!
std::array<A, 2> a{ 0, 1, 2, 3, 4, 5 };
// or equivalently
std::array<A, 2> a = { 0, 1, 2, 3, 4, 5 };

// 2) Using aggregate initialization with brace initialization of sub-elements
std::array<A, 2> a{ A{ 0, 1, 2 }, A{ 3, 4, 5 } };
// or equivalently
std::array<A, 2> a = { A{ 0, 1, 2 }, A{ 3, 4, 5 } };

// 3)
std::array<A, 2> a{{ { 0, 1, 2 }, { 3, 4, 5 } }};
// or equivalently
std::array<A, 2> a = {{ { 0, 1, 2 }, { 3, 4, 5 } }};

// 4) Using the copy constructor
std::array<A, 2> a{ 1, 2, 3 };
std::array<A, 2> a2(a);
// or equivalently
std::array<A, 2> a2 = a;

// 5) Using the move constructor
std::array<A, 2> a = std::array<A, 2>{ 0, 1, 2, 3, 4, 5 };

Accès aux éléments

1. at(pos)

Renvoie une référence à l'élément à la position pos avec vérification des bornes. Si pos n'est pas dans la plage du conteneur, une exception de type std::out_of_range est lancée.

La complexité est constante 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]

Renvoie une référence à l'élément à la position pos sans vérification des bornes. Si pos n'est pas dans la plage du conteneur, une erreur de violation de segmentation à l' exécution peut se produire. Cette méthode fournit un accès aux éléments équivalent aux tableaux classiques et à celui-ci plus efficace qu’à at(pos) .

La complexité est constante 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>

Cette fonction non-membre renvoie une référence à l'élément à la position de la constante de compilation pos sans vérification des bornes. Si pos n'est pas dans la plage du conteneur, une erreur de violation de segmentation à l' exécution peut se produire.

La complexité est constante 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()

Renvoie une référence au premier élément du conteneur. L'appel de front() sur un conteneur vide n'est pas défini.

La complexité est constante O (1).

Note: Pour un conteneur c, l’expression c.front() est équivalente à *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()

Renvoie la référence au dernier élément du conteneur. Le rappel back() sur un conteneur vide n'est pas défini.

La complexité est constante 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()

Renvoie le pointeur sur le tableau sous-jacent servant de stockage d'élément. Le pointeur est tel que la range [data(); data() + size()) est toujours une plage valide, même si le conteneur est vide ( data() n'est pas déréférencable dans ce cas).

La complexité est constante 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;
}

Vérification de la taille du tableau

L'un des principaux avantages de std::array par rapport au tableau de style C est que nous pouvons vérifier la taille du tableau en utilisant la fonction membre size()

int main() {
    std::array<int, 3> arr = { 1, 2, 3 };
    cout << arr.size() << endl;
}

Itérer à travers le tableau

std::array étant un conteneur STL, peut utiliser une boucle basée sur une plage similaire à d'autres conteneurs comme un vector

int main() {
     std::array<int, 3> arr = { 1, 2, 3 };
     for (auto i : arr)
         cout << i << '\n';
}

Changer tous les éléments du tableau à la fois

Le membre function fill() peut être utilisé sur std::array pour modifier les valeurs immédiatement après l'initialisation

int main() {
    
    std::array<int, 3> arr = { 1, 2, 3 };
    // change all elements of the array to 100
    arr.fill(100);
    
}


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow