A la recherche d'un tableau de c-chaînes pour une sous-chaîne en utilisant string_algo / gammes
-
25-10-2019 - |
Question
Je dois rechercher un tableau de c-strings pour une sous-chaîne.
Je créé ce que je pensais me retourner la réponse, mais il est seulement correct, mais syntaxiquement sémantiquement mal, mais je ne sais pas où je suis allé mal.
Il y a aussi une sous-question à ce sujet. Ce que je vais demander après vous montrer l'exemple que j'ai essayé.
#include <boost/algorithm/string/find.hpp>
const char Months[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
void Test()
{
typedef boost::iterator_range<boost::range_iterator<const char [20]>::type > constCharRange;
boost::iterator_range<char const *> ir = find_first("January", months);
}
ir.first == ir.last
Les résultats de l'iterator que je ne l'ai pas écrit cela correctement.
Je ne sais pas si le fait que le premier paramètre est en fait const char [8]
a un effet préjudiciable.
Ma principale question que dois-je faire pour la corriger, et la question supplémentaire est comment puis-je extraire le type qui find_first exige de constCharRange ou bien une telle typedef.
Modifier:
Je vois que je l'ai utilisé incorrectement fin. Je l'ai ensuite réussi à obtenir par exemple un peu différent au travail mais ils ne sont pas compatibles avec les définitions que j'ai en fait à utiliser (je peux ajouter au code mais pas modifier la définition actuelle).
const std::string Months[]= { /*same data as before*/
void StringTest2()
{
const std::string* sptr =0;
sptr = std::find(boost::begin(Months), boost::end(Months), std::string("February"));
if (sptr)
{
string sResult(*sptr);
}
}
Un autre test
const char* Months[]= { /*same data as before*/
void StringTest3()
{
const char **sptr = std::find(boost::begin(Months), boost::end(Months), "February");
if (sptr)
{
string sResult(*sptr);
}
}
Voici le plus proche que je peux obtenir, mais je ne peux pas sembler obtenir le bon type de retour de
void StringTest4()
{
const char Months[12][20]Months[]= { /*same data as before*/
std::find(boost::begin(Months), boost::end(Months), "February");
}
La solution
Je peux corriger StringTest4 faire des correspondances exactes, mais cette solution ne fonctionnera pas pour les partielles.
void StringTest4()
{
boost::range_iterator<const char [12][20]>::type sptr = std::find(boost::begin(Months), boost::end(Months), std::string("February"));
if (sptr)
{
string sResult(*sptr);
}
}
Notez le passage de std :: string plutôt que "February"
si nous ne le faisons pas std::find
alors sera simplement faire une comparaison de pointeur qui se traduirait donc par un échec.
Je préfère encore utiliser cela avec string_algo, mais je ne suis toujours pas sûr quels bits je aurais besoin pour que cela fonctionne avec succès const char Months[12][20]