[C++] Come trovare un carattere in un vector di stringhe (NON in un vector di array di caratteri)

francesfarmer
Ho un vector t in cui in ogni cella c'è una parola (stringa) e voglio scrivere una funzione in cui io scrivo il carattere che voglio cercare, ad esempio 'a', e la funzione ritorna quante volte in tutto il vector compare quel carattere.


Io ho scritto una funzione usando std::find, ma non funziona e comunque voglio scrivere una funzione senza usare questo tipo di funzioni già fatte.

int char_occurrence(character ch, vector<string> t) 
{ 
int count = 0; 
cout << "Enter character" << endl; 
cin >> ch; 
for(unsigned i = 0; i <t.size(); i++) { 
if( ch è nel vector //qui avevo usato std::find) 
count ++; 
} 
return count; 
} 


Mi spiegate come si fa?
P.s. Lo so che a questa domanda è già stato risposto un sacco di volte ma in ogni risposta si usa std::find.
Grazie!

Risposte
apatriarca
Perché il tipo nella funzione è character? E' un typedef di char? Che senso ha? Inoltre perché, se la funzione riceve come valore di input un carattere, dovrebbe chiederne un altro in input da console?

Siccome hai una stringa per ogni elemento del vettore, devi avere due cicli: uno per il vettore e un altro per la stringa interna. Quindi il codice avrà la forma:
int char_occurrence(char ch, const std::vector< std::string > &t)
{
    int count = 0;
    for (int i = 0; i < t.size(); ++i) {
        for (int j = 0; j < t[i].size(); ++j) {
            if (t[i][j] == ch) { ++count; }
        }
    }
    return count;
}

apatriarca
Volendo invece usare all'estremo un approccio più dichiarativo e basato sulle librerie standard, userei std::count e std::accumulate invece di std::find.. Qualcosa come il seguente:
int char_occurrence(char ch, const std::vector< std::string > &t)
{
    return std::accumulate(t.begin(), t.end(), 0, 
                          [ch](int c, const std::string &s) {
                              return c + std::count(s.begin(), s.end(), ch); 
                          });
}

Clwydiano
È molto interessante, ma questo codice è inutile nel mio problema analogo

apatriarca
In che senso? Potresti postare il testo del problema (dalla tua risposta immagino di aver frainteso quello che vuoi fare)?

axpgn
@apatriarca
Non è la stessa persona, è spam! :smt012

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.