Domanda

Sto cercando di scorrere tutti gli elementi di un array statico di stringhe nel miglior modo possibile.Voglio essere in grado di dichiararlo su una riga e aggiungere/rimuovere facilmente elementi da esso senza dover tenere traccia del numero.Sembra davvero semplice, vero?

Possibili non soluzioni:

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

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

Problemi: non è possibile creare il vettore su una riga con un elenco di stringhe

Possibile non soluzione 2:

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

Problemi: non c'è modo di ottenere automaticamente il numero di stringhe (che io sappia).

Deve esserci un modo semplice per farlo.

È stato utile?

Soluzione

IL potenziare assegnare la libreria sembra essere esattamente quello che stai cercando.Rende l'assegnazione di costanti ai contenitori più semplice che mai.

Altri suggerimenti

C++ 11 ha aggiunto elenchi di inizializzazione per consentire la seguente sintassi:

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

Il supporto per questa funzionalità di C++ 11 è stato aggiunto almeno CCG 4.4 e solo dentro Visual Studio 2013.

È possibile inizializzare in modo conciso a vector<string> da un creato staticamente char* vettore:

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

Questo copia tutte le stringhe, quindi usi il doppio della memoria.Puoi usare il suggerimento di Will Dean per sostituire il numero magico 3 qui con arraysize(str_array) - anche se ricordo che c'erano alcuni casi speciali in cui quella particolare versione di arraysize potrebbe fare qualcosa di brutto (mi dispiace, non riesco a ricordare immediatamente i dettagli) .Ma molto spesso funziona correttamente.

Inoltre, se sei davvero entusiasta della cosa di una riga, puoi definire una macro variadica in modo che una singola riga come DEFINE_STR_VEC(strvector, "hi", "there", "everyone"); lavori.

Problemi: non c'è modo di ottenere automaticamente il numero di stringhe (che io sappia).

Esiste un modo standard per farlo, che molte persone (inclusa MS) definiscono come macro arraysize per:

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

Dichiara un array di stringhe in C++ in questo modo: char array_of_strings[][]

Per esempio : char array_of_strings[200][8192];

conterrà 200 stringhe, ciascuna stringa avrà una dimensione di 8kb o 8192 byte.

utilizzo strcpy(line[i],tempBuffer); per inserire i dati nell'array di stringhe.

Una possibilità è utilizzare un puntatore NULL come valore di flag:

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

Puoi usare il begin E end funzioni dalla libreria dell'intervallo Boost per trovare facilmente le estremità di un array primitivo e, a differenza della soluzione macro, ciò darà un errore di compilazione invece di un comportamento interrotto se lo applichi accidentalmente a un puntatore.

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

Puoi usare il suggerimento di Will Dean [#define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] per sostituire qui il numero magico 3 con arraysize(str_array) - anche se ricordo che c'erano casi speciali in cui quella particolare versione di arraysize potrebbe fare qualcosa di brutto (mi dispiace non ricordare immediatamente i dettagli).Ma molto spesso funziona correttamente.

Il caso in cui non funziona è quando l'"array" è in realtà solo un puntatore, non un vero e proprio array.Inoltre, a causa del modo in cui gli array vengono passati alle funzioni (convertiti in un puntatore al primo elemento), non funziona tra le chiamate di funzione anche se la firma assomiglia a un array — some_function(string parameter[]) è davvero some_function(string *parameter).

Ho provato a votare a favore della risposta di Craig H secondo cui dovresti usare boost::assign, ma non ho un rappresentante :(

Ho riscontrato una tecnica simile nel primo articolo che abbia mai letto di Andrei Alexandrescu in Diario degli utenti C/C++, vol. 16, n. 9, settembre 1998, pagg.73-74 (ho la citazione completa perché è nei commenti della mia implementazione del suo codice che utilizzo da allora).

I modelli sono tuoi amici.

Ecco un esempio:

#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"));
}

Invece di quella macro, potrei suggerire questa:

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) Vogliamo utilizzare una macro per renderla una costante in fase di compilazione;il risultato della chiamata di funzione non è una costante in fase di compilazione.

2) Tuttavia, non vogliamo utilizzare una macro perché la macro potrebbe essere utilizzata accidentalmente su un puntatore.La funzione può essere utilizzata solo su array in fase di compilazione.

Quindi, utilizziamo la definizione della funzione per rendere la macro "sicura";se la funzione esiste (es.ha una dimensione diversa da zero), quindi utilizziamo la macro come sopra.Se la funzione non esiste restituiamo un valore errato.

#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;
}

Puoi dichiarare direttamente un array di stringhe come string s[100];.Quindi, se desideri accedere a elementi specifici, puoi ottenerli direttamente come s[2][90].Ai fini dell'iterazione, prendi la dimensione della stringa usando il comandos[i].size() funzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top