Ho cercato boost :: tokenizer e ho trovato che la documentazione è molto sottile. È possibile renderlo tokenize ad una stringa come "delfino-scimmia-babbuino" e rendere ogni parola un gettone, così come ogni doppio trattino un gettone? Dagli esempi ho visto solo i delimitatori a carattere singolo consentiti. La libreria non è abbastanza avanzata per delimitatori più complicati?Utilizzo di boost :: tokenizer con delimitatori di stringhe
risposta
Sembra che sarà necessario scrivere il proprio TokenizerFunction per fare ciò che si desidera.
Vedo. Speravo che ci fosse qualcosa di pre-fatto, ma immagino che speravo troppo. – Martin
Un'opzione è provare boost :: regex. Non sono sicuro delle prestazioni rispetto a un tokenizzatore personalizzato.
Questo è bello. Se funziona, ottiene il mio voto. :) –
utilizzando iter_split consente di utilizzare token di caratteri multipli. Il seguente codice dovrebbe produrre il seguente:
delfino
mon-chiave
babbuino
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/iter_find.hpp>
// code starts here
std::string s = "dolphin--mon-key--baboon";
std::list<std::string> stringList;
boost::iter_split(stringList, s, boost::first_finder("--"));
BOOST_FOREACH(std::string token, stringList)
{
std::cout << token << '\n'; ;
}
Questo ha lo svantaggio di creare una copia dell'intera stringa. Se la stringa che viene tokenizzata è grande, questo è un problema. Il tokenizzatore boost non lo fa. –
So che il tema è abbastanza vecchio, ma è dimostrato tra i primi link in Google quando ho cercare "BOOST tokenizer dalla stringa"
così vorrei aggiungere la mia variante di TokenizerFunction, nel caso in cui:
class FindStrTFunc
{
public:
FindStrTFunc() : m_str(g_dataSeparator)
{
}
bool operator()(std::string::const_iterator& next,
const std::string::const_iterator& end, std::string& tok) const
{
if (next == end)
{
return false;
}
const std::string::const_iterator foundToken =
std::search(next, end, m_str.begin(), m_str.end());
tok.assign(next, foundToken);
next = (foundToken == end) ? end : foundToken + m_str.size();
return true;
}
void reset()
{
}
private:
std::string m_str;
};
dopo possiamo creare
boost::tokenizer<FindStrTFunc> tok("some input...some other input");
e utilizzare, come al solito spinta tokenizzatore
l'implementazione non è l'ideale (potrebbe avere bug), è solo un esempio – Alek86
Solo curioso il motivo per cui questo è contrassegnato wiki comunità? –
Ho pensato che avrebbe permesso ad altri di chiarire la mia domanda nel caso fosse un po 'diffusa. Forse dovrei leggere su quello che è, fino alla prossima volta. – Martin