web-dev-qa-db-fra.com

Tri C++ String array

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;
}
16
ssj3goku878
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.

11
P0W

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;
}
27
Dietmar Kühl

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;

}

http://ideone.com/Q9Ew2l

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")

8
olevegard

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;    
}

Exemple live .

4
TemplateRex

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é!!!

2
nelt22

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;
}
2
lpapp

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.

1
zettix

Nous pouvons trier la fonction () pour trier le tableau de chaînes.

Procédure:  

  1. D'abord, déterminez le tableau de chaînes de taille.

  2. utiliser la fonction de tri. sort (nom_ array, nom_ array + taille)

  3. 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;
}
0
rashedcs