Tri std::les chaînes de caractères avec des chiffres en eux?
Je suis en train de trier par std::string < opérateur. Le problème c'est que:
30 < 9. Le 30 montre avant le 9 depuis 3 < 9, Windows 9x eu ce problème. Comment pourrais-je aller sur le tri numérique, de sorte que "30 Renards" s'affiche après "9 chiens". Je dois aussi ajouter que je suis en utilisant utf 8 codage.
Grâce
- double possible de Comment mettre en œuvre un naturel algorithme de tri en c++?
- Cela dépend du cas d'utilisation, bien sûr, mais pour les noms de fichiers en fait je préfère le pré-XP manière. Je déteste quand le logiciel essaie d'être trop intelligent, car alors il commence à gâcher les choses... essayez de tri d'une liste de hexadécimale les noms de fichiers dans >=XP.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une fonction de comparaison à utiliser avec
std::sort
. Cette fonction aurait pour vérifier si la chaîne commence par une valeur numérique. Si elle le fait, convertir la partie numérique de chaque chaîne d'unint
à l'aide d'un mécanisme comme un stringstream. Puis de comparer les deux valeurs entières. Si les valeurs de comparer également, comparer les non-partie numérique des chaînes de caractères de manière lexicographique. Sinon, si les chaînes ne contiennent pas une partie numérique, il suffit de comparer deux chaînes de caractères de manière lexicographique comme d'habitude.En gros, quelque chose comme ce qui suit (non testé) fonction de comparaison:
Et puis...
EDIT: bien sûr, cet algorithme n'est utile que si vous êtes tri de chaînes où la partie numérique apparaît au début de la chaîne. Si vous faites affaire avec des chaînes où la partie numérique peut apparaître n'importe où dans la chaîne de caractères, alors vous avez besoin d'un plus sophistiqué de l'algorithme. Voir http://www.davekoelle.com/alphanum.html pour plus d'informations.
atoi
est idéal pour cela, vous n'aurez même pas besoin de code spécial pour les chaînes qui ne commencez pas avec des chiffres (même si ils vont trier au début). Oustrtod
si vous souhaitez contrôler.atoi
serait beaucoup plus efficace questd::stringstream
.strtoll
pour la stackoverflow question ici, c'est moins correct dans un autre chemin, bien que - en supposant caractère direct de comparaison est l'ordre souhaité lorsqu'il n'est pas de comparer les chiffres.Si vous utilisez Windows (XP+) et peuvent se permettre de convertir vos chaînes utf-16, vous pouvez utiliser le
StrCmpLogicalW
fonction de Shlwapi. Voir msdn pour plus de détails.Sinon, ICU fournit cette fonctionnalité dans ses assembleurs. Voir
UCOL_NUMERIC_COLLATION
.Voici une version qui ne convertit pas en entier et travaille ainsi pendant de longues chaînes de chiffres indépendamment de sizeof(int).