¿Cómo encuentro la longitud de una matriz?

9 minutos de lectura

¿Como encuentro la longitud de una matriz
Maxpm

¿Hay alguna manera de encontrar cuántos valores tiene una matriz? Detectar si he llegado o no al final de una matriz también funcionaría.

  • ¿De dónde viene la matriz? Por lo general, las funciones que toman matrices también toman un parámetro de longitud para solucionar este problema.

    – Michael Myers

    5 de noviembre de 2010 a las 17:18

  • Bueno, estoy creando un programa de “libs locos” que tiene una matriz con todo el texto, así como las ubicaciones de los sustantivos/verbos que el usuario tiene que completar. Me gustaría usar una función para ejecutar el toda la matriz, reemplazando el “[noun]” y “[verb]”valores con texto ingresado por el usuario.

    – Máxpm

    5 de noviembre de 2010 a las 17:21

  • posible duplicado de Cómputo de la longitud de la matriz

    – Máxpm

    30 de noviembre de 2011 a las 13:21

  • Tenga en cuenta que en C las matrices no son objetos ni estructuras. Como tales, no tienen ningún parámetro de longitud almacenado en ningún lugar de forma predeterminada. Si desea trabajar con ellos como objetos en C++, use los objetos C++ std::vector o std::array de C++11 si puede. Si tiene que usar punteros, siempre pase la longitud de la matriz como segundo parámetro para cada función que trabaje con ella.

    – Pihhan

    5 de junio de 2013 a las 8:26

  • Si está usando C++ 20, también he agregado una respuesta para eso. Podría pasarse por alto fácilmente ya que hay tantas respuestas aquí.

    – gprathora

    8 de mayo de 2020 a las 1:19

¿Como encuentro la longitud de una matriz
Oliver Charlesworth

Si te refieres a una matriz de estilo C, entonces puedes hacer algo como:

int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << std::endl;

Esto no funciona con punteros (es decir, no funcionará para ninguno de los siguientes):

int *p = new int[7];
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;

o:

void func(int *p)
{
    std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
}

int a[7];
func(a);

En C++, si desea este tipo de comportamiento, debe usar una clase de contenedor; probablemente std::vector.

  • Tampoco funciona si pasa la matriz a una función diferente e intenta hacerlo allí 🙂

    – San Jacinto

    5 de noviembre de 2010 a las 17:21

  • @San: En ese caso, crea un function template

    – Prasoon Saurav

    5 de noviembre de 2010 a las 17:24

  • @San Jacinto: No, esto funciona (en arreglos) sin importar en qué función se encuentre. Sin embargo, es imposible pasar una matriz de longitud variable a una función como parámetro (se descompone en un puntero), pero si pasa una matriz dentro de una estructura, esto funciona como se esperaba.

    – eq-

    5 de noviembre de 2010 a las 17:25


  • @OliverCharlesworth también si pasó la matriz por valor a otra función y la probó allí, no funcionará, ¿verdad? La pregunta es por qué

    – A_Matar

    06/02/2015 a las 18:55

  • @A_Matar: no puede pasar una matriz por valor en C o C++.

    –Oliver Charlesworth

    6 de febrero de 2015 a las 22:28


¿Como encuentro la longitud de una matriz
Motti

Como han dicho otros, puedes usar el sizeof(arr)/sizeof(*arr)pero esto le dará la respuesta incorrecta para los tipos de puntero que no son matrices.

template<class T, size_t N>
constexpr size_t size(T (&)[N]) { return N; }

Esto tiene la buena propiedad de fallar al compilar para tipos que no son de matriz (Visual Studio tiene _countof que hace esto). los constexpr hace de esto una expresión de tiempo de compilación, por lo que no tiene ningún inconveniente sobre la macro (al menos ninguno que yo sepa).

También puede considerar usar std::array de C ++ 11, que expone su longitud sin sobrecarga sobre una matriz C nativa.

C++17 posee std::size() en el <iterator> encabezado que hace lo mismo y también funciona para contenedores STL (gracias a @Jon C).

  • Recibo dos errores al compilar (ni siquiera estoy tratando de usarlo): error C2265: ‘‘: la referencia a una matriz de tamaño cero es ilegal error C2266: ‘‘: referencia a un no- la matriz acotada constante es ilegal ¿Cuál es el problema?

    – jimifiki

    28 de agosto de 2013 a las 6:28

  • @yau así es como se escribe un referencia a una matriz, mira esta respuesta. Mi versión se ve un poco diferente ya que omití el nombre del parámetro ya que el parámetro no se usa, solo se necesita su tipo. Con un nombre seria T(arg&)[N].

    – Motti

    10 de enero de 2016 a las 7:11


  • Gracias Motti! El nombre del parámetro omitido ya estaba claro para mí. Pero increíble que aparentemente no tenía uso de referencias/punteros a arreglos nunca antes Y probablemente no lo hará en el futuro, ya que tales arreglos se están extinguiendo aún más.

    – tu

    11 de enero de 2016 a las 8:35


  • Si el uso de C++ 11 no es std::extent, ¿una mejor solución? es.cppreference.com/w/cpp/types/extent

    –Isaac Pascual

    16 de julio de 2018 a las 10:22

  • @IsaacPascual con el que no estaba familiarizado extent, mirándolo ahora, hay dos características que lo hacen menos útil que la función anterior (para este caso de uso). (1) Devuelve cero para punteros (en lugar de un error de compilación). (2) Requiere un parámetro de tipo, por lo que para verificar una variable tendría que hacer decltype

    – Motti

    16/07/2018 a las 11:30

1647574631 244 ¿Como encuentro la longitud de una matriz
mahlercinco

Haciendo sizeof myArray obtendrá el número total de bytes asignados para esa matriz. Luego puede averiguar la cantidad de elementos en la matriz dividiendo por el tamaño de un elemento en la matriz: sizeof myArray[0]

Entonces, obtienes algo como:

size_t LengthOfArray = sizeof myArray / sizeof myArray[0];

Ya que sizeof produce un size_tel resultado LengthOfArray también será de este tipo.

  • Esta es una solución muy simple y fácil para superar lo que parece ser un problema antiguo.

    usuario2993456

    3 de noviembre de 2014 a las 11:52

  • No funciona para arreglos “nuevos” de C++ sostenidos por un puntero. Obtiene el tamaño del puntero (4 bytes) o el tamaño de su primer elemento si lo desreferencia.

    – Señor de los Dragones

    5 de febrero de 2015 a las 0:42

  • @DragonLord sí, aunque cualquiera que declare el tamaño de la matriz con la palabra clave new ya sabrá el tamaño de la matriz en tiempo de ejecución, por lo que no es necesario usar el operador sizeof para encontrar el tamaño de la matriz en ese caso. Estoy seguro de que lo sabes. Esto es solo para el beneficio de cualquiera que no lo haga.

    – Martyn Shut

    14 de junio de 2015 a las 14:32


  • @surega No se bloqueará

    – CITBL

    8 de enero de 2019 a las 16:29

1647574632 295 ¿Como encuentro la longitud de una matriz
Juan C

Si bien esta es una vieja pregunta, vale la pena actualizar la respuesta a C++17. En la biblioteca estándar ahora está la función con plantilla std::size(), que devuelve el número de elementos tanto en un contenedor estándar como en una matriz de estilo C. Por ejemplo:

#include <iterator>

uint32_t data[] = {10, 20, 30, 40};
auto dataSize = std::size(data);
// dataSize == 4

¿Hay alguna manera de encontrar cuántos valores tiene una matriz?

¡Sí!

Tratar sizeof(array)/sizeof(array[0])

Detectar si he llegado o no al final de una matriz también funcionaría.

No veo ninguna forma de hacerlo a menos que su matriz sea una matriz de caracteres (es decir, una cadena).

PD: en C ++ siempre use std::vector. Hay varias funciones incorporadas y una funcionalidad extendida.

  • Esto no funcionaría para tamaños de matriz individuales variables

    – Don Laringe

    27 de diciembre de 2014 a las 23:41

  • +1 para vectores. Hay muy pocos casos sólidos para seguir usando las matrices de C++ de estilo antiguo. A menos que el tamaño de la matriz nunca cambie, pero incluso entonces, debe usar la clase de contenedor de matriz en su lugar. Es mejor usar una clase de contenedor como vector para el almacenamiento dinámico de matrices. Las ventajas de usar clases contenedoras superan con creces las desventajas de tener que administrar su propia memoria.

    – Martyn Shut

    14 de junio de 2015 a las 14:44

  • @MartynShutt Cuando está vinculado a la memoria caché, como en gamedev, a veces no puede permitirse el lujo de usar un vector.

    – Tara

    9 de mayo de 2019 a las 8:48

  • Si una matriz tiene 0 elementos, es matriz[0] legal entonces?

    – mercurio0114

    1 de diciembre de 2020 a las 8:23

  • @mercury0114 Las matrices de longitud 0 son ilegales en C++. E incluso si no lo fueran, aún puede evaluar el sizeof operador en array[0]dado que en realidad no lo evalúa en tiempo de ejecución, solo encuentra el tipo en tiempo de compilación para obtener el tamaño.

    – CoffeeTableEspresso

    21 de enero a las 22:51

1647574632 566 ¿Como encuentro la longitud de una matriz
eq-

std::vector tiene un método size() que devuelve el número de elementos en el vector.

(Sí, esta es una respuesta irónica)

  • Esto no funcionaría para tamaños de matriz individuales variables

    – Don Laringe

    27 de diciembre de 2014 a las 23:41

  • +1 para vectores. Hay muy pocos casos sólidos para seguir usando las matrices de C++ de estilo antiguo. A menos que el tamaño de la matriz nunca cambie, pero incluso entonces, debe usar la clase de contenedor de matriz en su lugar. Es mejor usar una clase de contenedor como vector para el almacenamiento dinámico de matrices. Las ventajas de usar clases contenedoras superan con creces las desventajas de tener que administrar su propia memoria.

    – Martyn Shut

    14 de junio de 2015 a las 14:44

  • @MartynShutt Cuando está vinculado a la memoria caché, como en gamedev, a veces no puede permitirse el lujo de usar un vector.

    – Tara

    9 de mayo de 2019 a las 8:48

  • Si una matriz tiene 0 elementos, es matriz[0] legal entonces?

    – mercurio0114

    1 de diciembre de 2020 a las 8:23

  • @mercury0114 Las matrices de longitud 0 son ilegales en C++. E incluso si no lo fueran, aún puede evaluar el sizeof operador en array[0]dado que en realidad no lo evalúa en tiempo de ejecución, solo encuentra el tipo en tiempo de compilación para obtener el tamaño.

    – CoffeeTableEspresso

    21 de enero a las 22:51

#include <iostream>

int main ()
{
    using namespace std;
    int arr[] = {2, 7, 1, 111};
    auto array_length = end(arr) - begin(arr);
    cout << "Length of array: " << array_length << endl;
}

  • Creo que este solo funciona para variables locales que están en la pila.

    – Señor de los Dragones

    5 de febrero de 2015 a las 0:44

  • Esta es la mejor respuesta. @DragonLord, también funciona para miembros vars. Ver cpp.sh/92xvv.

    – Shital Shah

    30 de agosto de 2017 a las 11:24

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad