Comment puis-je créer un std::vector<std::string>, et ensuite de les trier?
J'ai un tas de cordes que j'ai besoin de trier. Je pense qu'un std::vector serait la meilleure façon de le faire. Cependant, je n'ai jamais utilisé les vecteurs avant et donc aimerais un peu d'aide.
J'ai juste besoin de les trier par ordre alphanumérique, rien de spécial. En effet, le string::comparaison de la fonction de travail.
Après cela, comment puis-je effectuer une itération à travers eux pour vérifier qu'ils sont triés?
Voici ce que j'ai à ce jour:
std::sort(data.begin(), data.end(), std::string::compare);
for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i)
{
printf("%s\n", i.c_str);
}
- Veuillez voir cette réponse: [boost::tri][1] [1]: stackoverflow.com/a/14869307/1038233
Vous devez vous connecter pour publier un commentaire.
Il vous suffit de faire
Et il permettra de trier vos chaînes. Ensuite, allez à travers eux de vérifier si elles sont dans l'ordre
En particulier,
std::string::compare
ne pouvait pas être utilisé comme un traitement de référence, parce qu'il ne fait pas ce quesort
veut faire: retourne true si le premier argument est moins que la seconde, et retourne la valeur false sinon. Si vous utilisezsort
comme ci-dessus, il suffit d'utiliseroperator<
, qui permettra de faire exactement cela (j'.estd::string
fait retourfirst.compare(second) < 0
).Quelle est la question exactement? Il semble que tout est déjà là.
Cependant, vous devriez probablement utiliser
std::cout << *i << std::endl;
i
est un itérateur == pointeur vers les données dans le conteneur, de sorte*
est nécessairec_str()
est une fonction destd::string
et non une variableLes problèmes dans votre code ne se rapportent pas à votre question?
Quelques conseils pour vous:
std::vector
remplace également les[]
de l'opérateur, de sorte que vous pouvez économiser de l'itérateur de tracas et de l'utiliser comme un tableau (itération de0
àvector.size()
).std::set
au lieu de cela, ce qui a automatiquement le tri à l'insertion (arbre binaire), de sorte que vous économiser de l'extra tri.copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
litb est correct, comme toujours.
Je voulais juste souligner la plus générale - tout qui peut être comparé avec < peuvent être triés avec std::sort. Je vais parfois furtivement un opérateur< membre de la fonction dans une structure (struct), juste pour que je puisse le faire.
Pour trier utilisation:
std::sort
oustd::vector< std::string>::sort(..)
méthode.Pour vérifier si il est trié:
utilisation
std::is_sorted
pour vérifier est trié - http://www.sgi.com/tech/stl/is_sorted.htmlou
std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()
pour votre cas, vous pouvez utiliser la valeur par défaut comparateur de
ÉDITÉ:
std::is_sorted
n'est pas standard stl fonction, définie dans le sgi stl mise en œuvre.Merci @Brian Neal pour cette remarque.
De tri de la chaîne:
Vérifier si le vecteur est trié:
C++11 Méthode pour vérifier triés vecteur:
std::is_sorted(vec.begin(),vec.end())
Impression maintenant le vecteur trié:
std::is_sorted(vec.begin(),vec.end())
Vous pouvez utiliser un
std::set
, qui est naturellement une triés contenant.Essayez d'utiliser comaprator: