2013-03-26 2 views
2

Already asked this question et reçu des réponses à propos de C++ STL mais qu'en est-il de boost?boost :: algorithm :: string :: finder.hpp

Cette question concerne les moteurs de recherche. Si vous avez un lien vers des implémentations de bibliothèque de boost descriptibles, j'apprécierais de faciliter la recherche de la bibliothèque boost pour des applications pratiques.

Ma question est quel moteur boost finder s'applique le plus à lastIndexOf?

+0

Pouvez-vous expliquer votre cas d'utilisation. Pourquoi avez-vous besoin d'une instance finder au lieu d'utiliser la fonction explicite standard (ou boost) pour trouver le dernier index d'un caractère ou d'un modèle? Si vous voulez juste une fonction qui fonctionne pour trouver le dernier index d'un pattern, utilisez la solution @sftrabbit postée. –

+0

@ViteFalcon Oui, je cherche une fonction en boost qui trouve le dernier index d'un pattern et qui a choisi d'utiliser la solution postée. – Mushy

Répondre

2

Eh bien d'abord, l'option la plus simple si vous allez chercher la dernière occurrence d'une sous-chaîne est d'utiliser std::string::rfind:

std::string str = "Hello, World!"; 
int index = str.rfind("o"); 

Si vous devez utiliser Boost parce que vous voulez que cela fonctionne sur plages génériques, utilisez boost::algorithm::find_last. Cela prend deux plages. La deuxième plage est recherchée dans la première plage.

std::string str = "Hello, World!"; 
iterator_range<std::string::iterator> it = find_last(str, "o"); 
int index = std::distance(str.begin(), it.begin()); 

Si vous voulez vraiment à l'utilisateur un viseur, il semble que vous cherchez boost::algorithm::last_finder. Les trouveurs retournent un objet fonction qui prend deux itérateurs comme arguments. La fonction renvoie un iterator_range Vous pouvez l'utiliser comme suit:

auto finder = last_finder("o"); 

std::string str = "Hello, World!"; 
iterator_range<std::string::iterator> it = finder(str.begin(), str.end()); 
int index = std::distance(str.begin(), it.begin()); 
+0

Peut-être que la meilleure chose à faire est le mieux pour l'instant. Merci pour votre réponse. – Mushy

+0

@Mushy Pour être clair, vous savez que 'std :: string' a une fonction membre' rfind', n'est-ce pas? Si vous recherchez simplement des chaînes, utilisez-les. Utilisez les algorithmes 'boost' si vous avez besoin de travailler sur des conteneurs génériques. –

+0

Oui, je sais de rfind déterminé dans un lien vers ma question initiale. Êtes-vous en train de suggérer que la bibliothèque boost est la meilleure ou ne devrait peut-être être utilisée que sur des conteneurs génériques? J'ai un grand programme employant à la fois générique et non. – Mushy