Pour votre information: pas de boost, oui il a cela, je veux réinventer la roue;)iterator sélective
Y at-il une certaine forme d'un iterator sélectif (possible) en C++? Ce que je veux est de séparer les chaînes comme ceci:
some:word{or other
à une forme comme ceci:
some : word { or other
Je peux le faire avec deux boucles et find_first_of (« : ») et (« { ») mais cela me semble (très) inefficace. Je pensais qu'il y aurait peut-être un moyen de créer/définir/écrire un itérateur qui parcourrait toutes ces valeurs avec for_each. Je crains que cela m'oblige à écrire une classe d'itérateur à part entière et trop complexe pour une chaîne std :: string.
Je pensais que ce serait faire:
std::vector<size_t> list;
size_t index = mystring.find(":");
while(index != std::string::npos)
{
list.push_back(index);
index = mystring.find(":", list.back());
}
std::for_each(list.begin(), list.end(), addSpaces(mystring));
Cela semble désordre pour moi, et je suis tout à fait sûr une façon plus élégante de le faire existe. Mais je ne peux pas y penser. Quelqu'un a une idée brillante? Merci
PS: Je n'ai pas testé le code affiché, juste une écriture-up rapide de ce que je voudrais essayer
MISE À JOUR: après avoir pris toutes vos réponses en compte, je suis venu avec cela, et il travaille à mon goût :). cela suppose que le dernier char est un retour à la ligne ou quelque chose, sinon une fin {
, }
ou :
ne sera pas traitée.
void tokenize(string &line)
{
char oneBack = ' ';
char twoBack = ' ';
char current = ' ';
size_t length = line.size();
for(size_t index = 0; index<length; ++index)
{
twoBack = oneBack;
oneBack = current;
current = line.at(index);
if(isSpecial(oneBack))
{
if(!isspace(twoBack)) // insert before
{
line.insert(index-1, " ");
++index;
++length;
}
if(!isspace(current)) // insert after
{
line.insert(index, " ");
++index;
++length;
}
}
}
commentaires sont les bienvenus comme toujours :)
"Existe-t-il une forme d'itérateur sélectif (possible) en C++?" Eh bien, selon vous, Boost a ceci. Peut-être que je suis pédant, mais si vous demandez si quelque chose est possible immédiatement après avoir cité un exemple de ce qui est possible, je vais penser que votre question est un peu bête. Vous pourriez trouver instructif de lire le code source de l'implémentation de Boost pour comprendre comment ils l'ont fait. Même si vous voulez le réinventer, je suis sûr que Boost offrira quelques conseils sur la façon de le faire correctement. – Brian
* "Je crains que cela ne m'oblige à écrire une classe d'itérateur à part entière et trop complexe" * ... Boost a ses utilitaires d'itérateur exactement parce que l'écriture de ses propres itérateurs est agaçante. –