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.
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
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 unchar**
– 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
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 unchar**
– 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
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)
.
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