Se interessante in modo di farlo da soli e non usare il boost.
Supponendo che la stringa del delimitatore possa essere molto lunga, diciamo M, il controllo di ogni carattere nella stringa, se è un delimitatore, costerebbe O (M) ciascuno, così facendo in un ciclo per tutti i caratteri nell'originale stringa, diciamo lunga N, è O (M * N).
avrei usato un dizionario (come una mappa - "delimitatore" a "booleani" - ma qui vorrei usare un semplice array booleano che ha vero in index = valore ASCII per ogni delimitatore).
Ora l'iterazione sulla stringa e controllare se il carattere è un delimitatore è O (1), che alla fine ci fornisce O (N) nel complesso.
Ecco il mio codice di esempio:
const int dictSize = 256;
vector<string> tokenizeMyString(const string &s, const string &del)
{
static bool dict[dictSize] = { false};
vector<string> res;
for (int i = 0; i < del.size(); ++i) {
dict[del[i]] = true;
}
string token("");
for (auto &i : s) {
if (dict[i]) {
if (!token.empty()) {
res.push_back(token);
token.clear();
}
}
else {
token += i;
}
}
if (!token.empty()) {
res.push_back(token);
}
return res;
}
int main()
{
string delString = "MyDog:Odie, MyCat:Garfield MyNumber:1001001";
//the delimiters are " " (space) and "," (comma)
vector<string> res = tokenizeMyString(delString, " ,");
for (auto &i : res) {
cout << "token: " << i << endl;
}
return 0;
}
Nota: tokenizeMyString ritorna vettore per valore e creare in pila prima, quindi stiamo usando qui la potenza del compilatore >>> RVO - valore di ritorno ottimizzazione :)
Boost.StringAlgorithm o Boost.Tokenizer potrebbe essere d'aiuto. –
Oppure un'idea che puoi ottenere da questa risposta: http://stackoverflow.com/questions/4888879/elegant-ways-to-count-the-frequency-of-words-in-a-file – Nawaz
@ K-ballo : Secondo la domanda, non dovresti usare librerie esterne come Boost. – deepmax