Pregunta

Estoy intentando 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 el número de cadenas automáticamente (que yo sepa).

Debe haber una manera fácil de hacer esto.

¿Fue útil?

Solución

El impulsar asignar biblioteca Parece ser exactamente lo que estás buscando.Hace que la asignación de constantes a contenedores sea más fácil que nunca.

Otros consejos

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 al menos en CCG 4.4 y solo en Estudio visual 2013.

Puede inicializar de forma concisa un vector<string> de un creado estáticamente char* formación:

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

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

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

Problemas: no hay forma de obtener el número de cadenas automáticamente (que yo sepa).

Existe una forma estándar de hacer esto, en la que mucha gente (incluido MS) define macros como arraysize para:

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

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 una de las cuales tendrá 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 utilizar un puntero NULL como valor de indicador:

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

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 lo aplica accidentalmente a un puntero.

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

Puedes utilizar 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 algún caso especial en el que esa versión particular de arraysize podría hacer algo malo (lo siento, no puedo recordar los detalles de inmediato).Pero muy a menudo funciona correctamente.

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

Intenté votar a favor de la respuesta de Craig H de que deberías usar boost::assign, pero no tengo representante :(

Encontré una técnica similar en el primer artículo que leí de Andrei Alexandrescu en Diario de usuarios de C/C++, Vol 16, N° 9, septiembre de 1998, págs.73-74 (tengo la cita completa porque está en los comentarios de mi implementación de su código que he estado usando desde entonces).

Las plantillas son tus amigas.

He aquí un ejemplo:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main() {
    const char* const list[] = {"zip", "zam", "bam"};
    const size_t len = sizeof(list) / sizeof(list[0]);

    for (size_t i = 0; i < len; ++i)
        std::cout << list[i] << "\n";

    const std::vector<string> v(list, list + len);
    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}

En lugar de esa macro, podría sugerir esta:

template<typename T, int N>
inline size_t array_size(T(&)[N])
{
    return N;
}

#define ARRAY_SIZE(X)   (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) Queremos usar una macro para convertirla en una constante en tiempo de compilación;El resultado de la llamada a la función no es una constante en tiempo de compilación.

2) Sin embargo, no queremos usar una macro porque la macro podría usarse accidentalmente en un puntero.La función solo se puede utilizar en matrices en tiempo de compilación.

Entonces, usamos la definición de la función para hacer que la macro sea "segura";si la función existe (es decir,tiene un tamaño distinto de cero), entonces usamos la macro como se indicó anteriormente.Si la función no existe devolvemos un valor incorrecto.

#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}
#include <iostream.h>
#include <iomanip.h>

int main()
{
int n;
cout<<"enter the maximum number\n";
cin>>n;
cout<<"enter the first number\n";
for(int i=0;i<n;i++)
{

for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
cout<<"enter the second number\n";
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
cin>>b[i][k];
}
}
cout<<"the product will be\n";
for(int i=0;i<n;i++)
{
for(int g=0;g<n;g++)
{
c[i][g]=c[i][c]*c[i][j];
cout<<setw(5)<<c[i][g];
}
cout<<endl;
}
return 0;
}

Puede declarar directamente una matriz de cadenas como string s[100];.Luego, si desea acceder a elementos específicos, puede obtenerlo directamente como s[2][90].Para propósitos de iteración, tome el tamaño de la cadena usando els[i].size() función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top