J'ai tellement de mal à essayer de comprendre la fonction de tri de la bibliothèque C++ et à essayer de trier ce tableau de chaînes de a-z, help please !!
On m'a dit d'utiliser cela, mais je n'arrive pas à comprendre ce que je fais de travers.
// std::sort(stringarray.begin(), stringarray.end());
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int z = 0;
string name[] = {"john", "bobby", "dear",
"test1", "catherine", "nomi",
"shinta", "martin", "abe",
"may", "zeno", "zack", "angeal", "gabby"};
sort(name[0],name[z]);
for(int y = 0; y < z; y++)
{
cout << name[z] << endl;
}
return 0;
}
int z = sizeof(name)/sizeof(name[0]); //Get the array size
sort(name,name+z); //Use the start and end like this
for(int y = 0; y < z; y++){
cout << name[y] << endl;
}
Modifier :
Considérant toutes les conventions de nommage "appropriées" (selon les commentaires):
int N = sizeof(name)/sizeof(name[0]); //Get the array size
sort(name,name+N); //Use the start and end like this
for(int i = 0; i < N; i++){
cout << name[i] << endl;
}
Remarque: La réponse de Dietmar Kühl est la meilleure à tous égards. std::begin()
& std::end()
devrait être utilisé pour std::sort
comme les fonctions avec C++ 11, sinon elles peuvent être définies.
Les algorithmes utilisent l'itérateur au début et au-delà de la fin de la séquence. Autrement dit, vous souhaitez appeler std::sort()
quelque chose comme ceci:
std::sort(std::begin(name), std::end(name));
Si vous n'utilisez pas C++ 11 et que vous n'avez ni std::begin()
ni std::end()
, ils sont faciles à définir (évidemment pas dans l'espace de noms std
):
template <typename T, std::size_t Size>
T* begin(T (&array)[Size]) {
return array;
}
template <typename T, std::size_t Size>
T* end(T (&array)[Size]) {
return array + Size;
}
Exemple d'utilisation de std :: vector
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
int main()
{
/// Initilaize vector using intitializer list ( requires C++11 )
std::vector<std::string> names = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};
// Sort names using std::sort
std::sort(names.begin(), names.end() );
// Print using range-based and const auto& for ( both requires C++11 )
for(const auto& currentName : names)
{
std::cout << currentName << std::endl;
}
//... or by using your orignal for loop ( vector support [] the same way as plain arrays )
for(int y = 0; y < names.size(); y++)
{
std:: cout << names[y] << std::endl; // you were outputting name[z], but only increasing y, thereby only outputting element z ( 14 )
}
return 0;
}
Cela évite complètement d'utiliser des tableaux simples et vous permet d'utiliser la fonction std :: sort. Vous devrez peut-être mettre à jour votre compilateur pour utiliser le = {...}
. Vous pouvez plutôt les ajouter en utilisant vector.Push_back("name")
Votre boucle ne fait rien car votre compteur z
est 0 (et 0 <0 vaut false
, la boucle ne démarre donc pas).
Au lieu de cela, si vous avez accès à C++ 11 (et vous devriez vraiment viser cela!), Essayez d’utiliser des itérateurs, par exemple. en utilisant les fonctions non membres std::begin()
et std::end()
, et une boucle plage pour afficher le résultat:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
int z = 0;
string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};
sort(begin(name),end(name));
for(auto n: name){
cout << n << endl;
}
return 0;
}
Comme beaucoup de personnes ici ont déclaré, vous pouvez utiliser std :: sort pour trier, mais que va-t-il se passer lorsque vous voudrez, par exemple, trier de z-a? Ce code peut être utile
bool cmp(string a, string b)
{
if(a.compare(b) > 0)
return true;
else
return false;
}
int main()
{
string words[] = {"this", "a", "test", "is"};
int length = sizeof(words) / sizeof(string);
sort(words, words + length, cmp);
for(int i = 0; i < length; i++)
cout << words[i] << " ";
cout << endl;
// output will be: this test is a
}
Si vous souhaitez inverser l'ordre de tri, modifiez simplement le signe dans la fonction cmp.
J'espère que c'est utile :)
À votre santé!!!
Cela fonctionne pour moi:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};
int sname = sizeof(name)/sizeof(name[0]);
sort(name, name + sname);
for(int i = 0; i < sname; ++i)
cout << name[i] << endl;
return 0;
}
Le conteneur multiset utilise un arbre rouge-noir pour conserver les éléments triés.
// using the multiset container to sort a list of strings.
#include <iostream>
#include <set>
#include <string>
#include <vector>
std::vector<std::string> people = {
"Joe",
"Adam",
"Mark",
"Jesse",
"Jess",
"Fred",
"Susie",
"Jill",
"Fred", // two freds.
"Adam",
"Jack",
"Adam", // three adams.
"Zeke",
"Phil"};
int main(int argc, char **argv) {
std::multiset<std::string> g(people.begin(), people.end()); // """sort"""
std::vector<std::string> all_sorted (g.begin(), g.end());
for (int i = 0; i < all_sorted.size(); i++) {
std::cout << all_sorted[i] << std::endl;
}
}
Exemple de sortie:
Adam
Adam
Adam
Fred
Fred
Jack
Jess
Jesse
Jill
Joe
Mark
Phil
Susie
Zeke
Notez que l'avantage est que le multiset reste trié après les insertions et les suppressions, ce qui est idéal pour afficher des connexions actives ou non.
Nous pouvons trier la fonction () pour trier le tableau de chaînes.
Procédure:
D'abord, déterminez le tableau de chaînes de taille.
utiliser la fonction de tri. sort (nom_ array, nom_ array + taille)
Itérer dans un tableau de chaînes /
Extrait de code
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};
int len = sizeof(name)/sizeof(name[0]);
sort(name, name+len);
for(string n: name)
{
cout<<n<<" ";
}
cout<<endl;
return 0;
}