[C++] Tri alphabétique STL, j'y arrive pas :'(

Statut
N'est pas ouverte pour d'autres réponses.

neku

Codeur roumain
Voici mon programme de test pour effectuer un tri alphabétique, mais ne fonctionnant pas ...
Si quelqu'un pourrais m'expliquer comment faire, ce serais vraiment gentil.
J'ai juste remarqué que ce code inverse l'ordre de sortie de chaque chaine mais les trie pas par ordre alphabétique.

Code:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm> 

std::ostream& operator <<(std::ostream& Stream, char*& a) 
{ 
   return Stream << a; 
} 

struct SortByString 
{ 
   bool operator ()(char*& a1, char*& a2) const 
   { 
      return a1 < a2; 
   } 
}; 

int main(int argc, char* argv[])
{
	std::vector<char*> Test;
	
	Test.push_back("c");
	Test.push_back("a");
	Test.push_back("f");
	Test.push_back("b");
	Test.push_back("z");
	
	std::sort (Test.begin(),Test.end(),SortByString());
	std::copy(Test.begin(), Test.end(), std::ostream_iterator<char*>(std::cout, "\n")); 

	
	system("pause");
	return 0;
}
 
1er
OP
neku

neku

Codeur roumain
Je me disais bien que un tri alphabétique ne pouvais avoir ma peau, alors pour une raison inconue le tri ne fonctionne pas sur un type char* mais bien sur un type std::string

Code:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm> 
#include <string>

std::ostream& operator <<(std::ostream& Stream, std::string a) 
{ 
   return Stream << a; 
} 

struct SortByString 
{ 
   bool operator ()(std::string a1, std::string a2) const 
   { 
      return a1 < a2; 
   } 
}; 

int main(int argc, char* argv[])
{
	std::vector<std::string> Test;
	
	Test.push_back("c");
	Test.push_back("a");
	Test.push_back("f");
	Test.push_back("b");
	Test.push_back("z");
	
	std::sort (Test.begin(),Test.end(),SortByString());
	std::copy(Test.begin(), Test.end(), std::ostream_iterator<std::string>(std::cout, "\n")); 

	
	system("pause");
	return 0;
}
 

Tifox

ou pas
Ca ne vient peut-être pas de la, mais ton utilisation des char me chifonne dans le premier algo.

Tout d'abord, ton vecteur contient des char*. Soit chaque élement ne contiendre qu'un caractère, auquel cas il faut simplement utiliser un char, soit ça peut contenir des chaines de caractères, auqel cas tu dois faire des malloc() avant le push_back, ou mieux, utiliser les string comme tu l'a fait.

Ensuite, operator ()(char*& a1, char*& a2), ça parait très zarebi. Passer un pointeur en référence, pas sur du tout que ça fasse ce qu'il faut. Vire les &, ça sera déjà mieux. Ensuite, regarde exactement ce que donne l'opérateur < entre deux chars, car je ne pense pas que ça fait une comparaison alphabetique.
 
1er
OP
neku

neku

Codeur roumain
Merci beaucoup pour vos réponse, mais cette nuit j'ai trouvé solution à tout mes problème :p
Et il me semble que char* ou char*& comme argument revient au même vu que l'orsque l'on passe une chaine on la passe par référence ,)
j'ai fais des essaye et char* ou char*& ne change strictement rien
 

Froggy

fake geek
neku a dit:
Merci beaucoup pour vos réponse, mais cette nuit j'ai trouvé solution à tout mes problème :p
Et il me semble que char* ou char*& comme argument revient au même vu que l'orsque l'on passe une chaine on la passe par référence ,)
j'ai fais des essaye et char* ou char*& ne change strictement rien
ce serait bien que tu la mettes ici ta solution ... on sait jamais que ca aiderais qqun d'autre ;)
 

Tifox

ou pas
Un char* n'est pas une chaine de caractère, c'est juste un pointeur en mémoire vers le premier caractère de la chaine. C'est pour ça que passer un pointeur en référence, ça a peu de sens (ceci dit, ça marche peut-être).

Sinon, pour la solution, il y a notamment celle des string qu'il a mise plus haut.
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut