c++ - vettore - passare un array di stringhe ad una funzione




Come dichiarare un array di stringhe in C++? (10)

Problemi - nessun modo per ottenere automaticamente il numero di stringhe (che io sappia).

C'è un modo standard per fare questo, che molte persone (tra cui MS) definiscono macro come arraysize per:

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

Sto cercando di scorrere tutti gli elementi di una serie statica 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: nessun modo per creare il vettore su una riga con un elenco di stringhe

Possibile non soluzione 2:

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

Problemi - nessun modo per ottenere automaticamente il numero di stringhe (che io sappia).

Ci deve essere un modo semplice per farlo.


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

Il caso in cui non funziona è quando la "matrice" è in realtà solo un puntatore, non una matrice reale. 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 ha l'aspetto di un array - some_function(string parameter[]) è veramente some_function(string *parameter) .


È possibile utilizzare le funzioni di begin e end della libreria Boost Range per trovare facilmente le estremità di una matrice primitiva e, a differenza della soluzione macro, questo darà un errore di compilazione invece di un comportamento interrotto se lo si applica accidentalmente a un puntatore.

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

C ++ 11 ha aggiunto gli 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 in almeno GCC 4.4 e solo in Visual Studio 2013 .


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

Ho provato a sopravvalutare la risposta di Craig H che dovresti usare boost :: assign, ma non ho nessuna risposta :(

Ho incontrato una tecnica simile nel primo articolo che ho mai letto da Andrei Alexandrescu in C / C ++ Users Journal , Vol 16, No 9, settembre 1998, pp. 73-74 (avere la citazione completa perché è nei commenti della mia implementazione di il suo codice che uso da allora).

I modelli sono tuoi amici.


La libreria di assegnazione boost sembra essere esattamente quello che stai cercando. Rende più facile che mai l'assegnazione delle costanti ai contenitori.


Puoi dichiarare direttamente un array di stringhe come string s[100]; . Quindi se vuoi accedere a elementi specifici, puoi farlo direttamente come s[2][90] . Per scopi di iterazione, prendi la dimensione della stringa usando la funzione s[i].size() .


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






arrays