C++ String array sorteren

Ik heb zoveel moeite om de sorteerfunctie uit de C++-bibliotheek te achterhalen en deze reeks strings te sorteren van a-z , help alstublieft!!

Ik kreeg te horen dat ik dit moest gebruiken, maar ik kom er niet achter wat ik verkeerd doe.

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

Antwoord 1, autoriteit 100%

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

Bewerken :

Rekening houdend met alle “juiste” naamgevingsconventies (volgens opmerkingen):

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

Opmerking:Dietmar Kühls antwoord is in alle opzichten het beste, std::begin()& std::end()moet worden gebruikt voor std::sort-achtige functies met C++11, anders kunnen ze worden gedefinieerd.


Antwoord 2, Autoriteit 238%

De algoritmen gebruiken iterator naar het begin en het afgelopen einde van de reeks. Dat wil zeggen, u wilt bellen std::sort()zoiets:

std::sort(std::begin(name), std::end(name));

Als u C++ 11 niet gebruikt en u niet hebt std::begin()EN std::end(), ZE ZIJN Gemakkelijk om jezelf te definiëren (natuurlijk niet in naamruimte 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;
}

Antwoord 3, Autoriteit 69%

Voorbeeld met behulp van 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

Dit vermijdt volledig het gebruik van gewone arrays, en laat je de std::sort functie gebruiken. Mogelijk moet u uw compiler bijwerken om de = {...}te gebruiken. U kunt ze in plaats daarvan toevoegen door vector.push_back("name")

te gebruiken


Antwoord 4, autoriteit 31%

Je lus doet niets omdat je teller z0 is (en 0 < 0 evalueert tot false, dus de lus start nooit).

Als je toegang hebt tot C++11 (en daar moet je echt naar streven!) probeer dan iterators te gebruiken, b.v. door de niet-ledenfunctie std::begin()en std::end()te gebruiken, en een range-for-lus om het resultaat weer te geven:

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

Live voorbeeld.


Antwoord 5, autoriteit 23%

Dit werkt voor mij:

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

Antwoord 6, autoriteit 15%

Zoals velen hier hebben aangegeven, zou je std::sort kunnen gebruiken om te sorteren, maar wat gaat er gebeuren als je bijvoorbeeld wilt sorteren van z-a? Deze code kan nuttig zijn

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 
}

Als u de volgorde van sorteren wilt omkeren, wijzigt u gewoon het teken in de cmp-functie.

Ik hoop dat dit nuttig is 🙂

Proost!!!


Antwoord 7, autoriteit 8%

De container met meerdere sets gebruikt een rood-zwarte boom om elementen gesorteerd te houden.

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

Voorbeelduitvoer:

Adam
Adam
Adam
Fred
Fred
Jack
Jess
Jesse
Jill
Joe
Mark
Phil
Susie
Zeke

OPMERKING Het voordeel is dat het Multiset gesorteerd blijft na invoegingen en deleties, geweldig voor het weergeven van actieve verbindingen of wat niet.


Antwoord 8

We kunnen () functie sorteren om stringarray te sorteren.

procedure:

  1. Bepaal eerst de Size String Array.

  2. Gebruik Sorteerfunctie. Sorteer (array_name, array_name + maat)

  3. iterate through string array /


Code Snippet

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

Antwoord 9

Mijn oplossing is iets anders dan die van die hierboven en werkt zoals ik het net heb uitgevoerd. Dus voor interesse:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
  char *name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};
  vector<string> v(name, name + 14);
  sort(v.begin(),v.end());
  for(vector<string>::const_iterator i = v.begin(); i != v.end(); ++i) cout << *i << ' ';
  return 0;
}

Other episodes