¿Cómo declarar una matriz de cadenas en C++?

5 minutos de lectura

avatar de usuario
naumcho

Estoy tratando de iterar sobre todos los elementos de una matriz estática de cadenas de la mejor manera posible. Quiero poder declararlo en una línea y agregar/eliminar elementos fácilmente sin tener que realizar un seguimiento del número. Suena muy simple, ¿no?

Posibles no soluciones:

vector<string> v;
v.push_back("abc");
b.push_back("xyz");

for(int i = 0; i < v.size(); i++)
    cout << v[i] << endl;

Problemas: no hay forma de crear el vector en una línea con una lista de cadenas

Posible no solución 2:

string list[] = {"abc", "xyz"};

Problemas: no hay forma de obtener la cantidad de cadenas automáticamente (que yo sepa).

Debe haber una manera fácil de hacer esto.

  • los aumentar la biblioteca de asignación parece ser exactamente lo que estás buscando. Hace que la asignación de constantes a los contenedores sea más fácil que nunca.

    – Craig H.

    29 de agosto de 2008 a las 18:44

avatar de usuario
antonio calambre

C++ 11 agregó listas de inicialización para permitir la siguiente sintaxis:

std::vector<std::string> v = {"Hello", "World"};

Se agregó soporte para esta característica de C++ 11 en al menos CCG 4.4 y solo en estudio visual 2013.

  • 2018. Acabo de empezar con C++ e investigué bastante sobre arreglos flexibles. Terminé usando solo vectores…

    – rmolinamir

    16 de noviembre de 2018 a las 3:25


Puede inicializar de forma concisa un vector<string> de una creación estática char* formación:

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

Esto copia todas las cadenas, por cierto, por lo que usa el doble de memoria. Puede usar la sugerencia de Will Dean para reemplazar el número mágico 3 aquí con arraysize (str_array), aunque recuerdo que hubo un caso especial en el que esa versión particular de arraysize podría causar algo malo (lo siento, no puedo recordar los detalles inmediatamente) . Pero muy a menudo funciona correctamente.

Además, si está realmente entusiasmado con la cosa de una línea, puede definir una macro variable para que una sola línea como DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); obras.

  • Ya que strarray está en un encabezado, ¿no violará la regla de definición única?

    – jww

    21 de febrero de 2017 a las 4:41

avatar de usuario
decano

Problemas: no hay forma de obtener la cantidad de cadenas automáticamente (que yo sepa).

Hay una forma estándar de hacer esto, que muchas personas (incluido MS) definen macros como arraysize por:

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

  • Alternativamente, uno podría usar algo como esto: template<typename T, size_t N> inline size_t arraysize(T (&ar)[N]) { return N; } (La palabra clave en línea no es necesaria, pero se usa para documentar la intención de la función. En teoría, un compilador moderno debería poder devolver la función completa, creo.

    – Justin Time – Reincorporar a Monica

    07/03/2016 a las 21:12

  • Esto falla para los punteros. El conteo de los elementos de la matriz debe hacerse de una manera diferente en C++.

    – jww

    21 de febrero de 2017 a las 4:40

Declare una matriz de cadenas en C++ como esta: char array_of_strings[][]

Por ejemplo : char array_of_strings[200][8192];

contendrá 200 cadenas, cada cadena con un tamaño de 8 kb o 8192 bytes.

usar strcpy(line[i],tempBuffer); para poner datos en la matriz de cadenas.

Una posibilidad es usar un puntero NULL como valor de indicador:

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}

  • ¿Qué significa char ** en realidad? En Java, ¿sería una lista de cadenas?

    – SoyGroot

    11/10/2012 a las 14:05

  • @Doomsknight: En este caso, sí. En la primera línea defino una matriz de char*. En la memoria, esto se presenta como 3 punteros: uno apunta a “perro”, uno apunta a “gato” y uno se deja NULL. Puedo llevar un puntero a ese primer puntero y obtener un char** – un puntero a puntero a char. Cuando incremento eso, muevo el carácter ** para señalar el siguiente elemento en la lista: un puntero al puntero que apunta a “gato”, luego lo incremento nuevamente y obtengo un puntero que apunta al puntero NULL, y Sé que he terminado. (

    – eclipse

    11/10/2012 a las 14:54


avatar de usuario
cosas logicas

Puedes usar el begin y end funciones de la biblioteca de rango Boost para encontrar fácilmente los extremos de una matriz primitiva y, a diferencia de la solución macro, esto dará un error de compilación en lugar de un comportamiento roto si accidentalmente lo aplica a un puntero.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

  • ¿Qué significa char ** en realidad? En Java, ¿sería una lista de cadenas?

    – SoyGroot

    11/10/2012 a las 14:05

  • @Doomsknight: En este caso, sí. En la primera línea defino una matriz de char*. En la memoria, esto se presenta como 3 punteros: uno apunta a “perro”, uno apunta a “gato” y uno se deja NULL. Puedo llevar un puntero a ese primer puntero y obtener un char** – un puntero a puntero a char. Cuando incremento eso, muevo el carácter ** para señalar el siguiente elemento en la lista: un puntero al puntero que apunta a “gato”, luego lo incremento nuevamente y obtengo un puntero que apunta al puntero NULL, y Sé que he terminado. (

    – eclipse

    11/10/2012 a las 14:54


avatar de usuario
matthew crumley

Puedes usar la sugerencia de Will Dean[[#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))]para reemplazar el número mágico 3 aquí con arraysize (str_array), aunque recuerdo que hubo un caso especial en el que esa versión particular de arraysize podría hacer algo malo (lo siento, no puedo recordar los detalles inmediatamente). Pero muy a menudo funciona correctamente.

El caso en el que no funciona es cuando la “matriz” es realmente solo un puntero, no una matriz real. Además, debido a la forma en que las matrices se pasan a las funciones (convertidas en un puntero al primer elemento), no funciona en las llamadas a funciones, incluso si la firma parece una matriz: some_function(string parameter[]) realmente es some_function(string *parameter).

¿Ha sido útil esta solución?