Matriz de biblioteca estándar de C++

Introducción

std::array es una encapsulación de clases de una matriz estilo C y proporciona algunos miembros para garantizar el uso seguro de las matrices. Se encuentra en el archivo de encabezado y debe usarse: #include <array>

definición

namespace std {
    
    
    template <typename T, size_t N>
    class array;
}
  1. T especificado como una matriz puede ser de cualquier tipo
  2. N especifica el tamaño de la matriz, por lo que el resultado del miembro size() de la matriz siempre es N y no se puede expandir dinámicamente.

inicialización

std::array<int, 4> a; // 拥有4个int元素的数组,每个元素值为随机值
std::array<int, 4> a = {
    
    }; // 拥有4个int元素的数组,每个元素值为0
std::array<int, 4> a = {
    
    1, 2, 3, 4}; // 拥有4个int元素的数组,元素一次初始化为1, 2, 3, 4
std::array<int, 4> a = {
    
    1}; // 拥有4个int元素的数组, 第一个元素初始化为1, 其余的都初始化为0
std::array<int, 4> a = {
    
    1, 2, 3, 4, 5}; // 错误,初始化列表的最大个数不能超过指定数组的大小 并不可以动态扩容

Operaciones de matriz

  1. estructura
  • array<Elem, N> c construye una matriz de forma predeterminada. Si el elemento es un objeto, llame al constructor del objeto. Si es un tipo incorporado, será un valor aleatorio.
  • array<Elem, N> c(c2) copia el constructor, crea otra matriz, todos los elementos se copiarán a la matriz recién creada
  • array<Elem, N> c(rv) mueve la construcción, tomando el contenido del rvalue para crear una nueva matriz.
  • array<Elem, N> c = rv mueve la construcción, toma el contenido del rvalue para crear una nueva matriz.
  • array<Elem, N> c = initlist inicializa la lista y construye una nueva matriz usando los valores de la lista. Si no hay suficientes elementos en la lista, los elementos restantes se completan con 0, lo que genera un error de compilación.
  1. intercambio
  • array<Elem, N>::swap() solo puede intercambiar matrices con el mismo tipo de elemento y número de elementos.
  1. tamaño
  • array<Elem, N>::size() El valor del tamaño es N. Si N es 0, es una matriz sin ningún elemento. En este caso, los iteradores comienzan(), final(), cbegin(), cend () devolverá el mismo valor, pero los valores devueltos por front() y back() son ambiguos y no los use para el valor devuelto por data().
  1. acceso
  • c[índice] Acceso aleatorio, devuelve el valor en el índice (no verifica el rango)
  • c.at(index) devuelve el valor en idnex (comprueba el rango; si está fuera de rango, genera una excepción de error de rango)
  • c.front() devuelve el primer elemento (no verifica el rango, tenga cuidado con la matriz fuera de límites)
  • c.back() devuelve el último elemento (no verifica el rango, tenga cuidado con la matriz fuera de límites)
  • c.begin() devuelve un iterador aleatorio que apunta al primer elemento de la matriz
  • c.end() devuelve un iterador aleatorio que apunta a la siguiente posición del último elemento de la matriz
  • c.cbegin() devuelve un iterador aleatorio constante que apunta al primer elemento de la matriz
  • c.cend() devuelve un iterador aleatorio constante que apunta a la siguiente posición del último elemento de la matriz
  • c.rbegin() devuelve un iterador inverso, que apunta al primer elemento del iterador inverso, que es el último elemento de la matriz.
  • c.rend() devuelve un iterador inverso, que apunta al último elemento del iterador inverso y a la posición anterior del primer elemento de la matriz.
  1. matriz como matriz de estilo c
  • &a[i] = &a[0] + i es similar al grupo de elementos de estilo C. El i-ésimo elemento puede usar la primera dirección de la matriz + desplazamiento, como strcpy(&a[0] + 3, "hola") ;
  • a.data() devuelve la primera dirección del grupo de elementos. Asegúrese de verificar el tamaño cuando lo use para asegurarse de que la matriz no cruce el límite, como strcpy(a.data(), “hello”);
  1. Manejo de excepciones
  • Solo la función at() realiza la verificación de límites fuera de los límites de la matriz. Una vez fuera de los límites, se generará una excepción de rango eeor. Otras funciones no generarán excepciones y no realizarán la verificación de excepciones. Sólo puedes confiar en ti mismo para todo.

Pequeña demostración de matriz

#include <iostream>
#include <array>

template<typename T, std::size_t N>
std::ostream &operator<<(std::ostream &os, const std::array<T, N> &arr) {
    
    
    os << "[";
    // 随机遍历 使用下标
    for (std::size_t i = 0; i < N; ++i) {
    
    
        os << arr[i];
        if (i != N - 1) {
    
    
            os << ", ";
        }
    }
    os << "]";
    return os;
}
int main()
{
    
    
    system("chcp 65001");
    // 初始化
    std::array<int, 4> a1; 
    std::cout << "a1:" << a1 << std::endl;
    std::array<int, 4> a2 = {
    
    }; 
    std::cout << "a2:" << a2 << std::endl;\
    std::array<int, 4> a3 = {
    
     1, 2, 3, 4 };
    std::cout << "a3:" << a3 << std::endl;
    std::array<int, 4> a4 = {
    
     1 }; 
    std::cout << "a4:" << a4 << std::endl;

    std::cout << "交换a1, a2" << std::endl;
    a1.swap(a2);
    std::cout << "a1:" << a1 << " a2:" << a2 << std::endl;
    std::cout << "move a4 到 a3" << std::endl;
    a3 = std::move(a4);
    std::cout << "a3:" << a3 << " a4:" << a4 << std::endl;

    // 迭代器遍历
    auto begin = a1.begin();
    auto end = a1.end();
    std::cout << "遍历a1: [";
    while (begin != end)
    {
    
    
        std::cout << *begin << ", ";
        begin++;
    }
    std::cout << "]" << std::endl;
    // 范围for遍历
    std::cout << "范围for 遍历a1: [";
    for (int item : a1)
    {
    
    
        std::cout << item << ", ";
    }
    std::cout << "]" << std::endl;
    return 0;
}

producción

Active code page: 65001
a1:[-858993460, -858993460, -858993460, -858993460]
a2:[0, 0, 0, 0]
a3:[1, 2, 3, 4]
a4:[1, 0, 0, 0]
交换a1, a2
a1:[0, 0, 0, 0] a2:[-858993460, -858993460, -858993460, -858993460]
move a4 到 a3
a3:[1, 0, 0, 0] a4:[1, 0, 0, 0]
遍历a1: [0, 0, 0, 0, ]
范围for 遍历a1: [0, 0, 0, 0, ]

Supongo que te gusta

Origin blog.csdn.net/qq_33944628/article/details/132817971
Recomendado
Clasificación