wake-up-neo.com

Wie kann ich std :: vector <std :: string> erstellen und dann sortieren?

Ich habe eine Reihe von Saiten, die ich sortieren muss. Ich denke, ein std :: vector wäre der einfachste Weg, dies zu tun. Ich habe jedoch noch nie Vektoren verwendet und hätte gerne etwas Hilfe.

Ich muss sie nur alphanumerisch sortieren, nichts Besonderes. In der Tat würde die Funktion string :: compare funktionieren.

Wie kann ich danach durchlaufen, um zu überprüfen, ob sie sortiert sind?

Folgendes habe ich bisher:

std::sort(data.begin(), data.end(), std::string::compare);

for(std::vector<std::string>::iterator i = data.begin(); i != data.end(); ++i)
{
    printf("%s\n", i.c_str);
}
29
samoz

Du kannst es einfach tun 

std::sort(data.begin(), data.end());

Und es wird Ihre Saiten sortieren. Dann durchgehen und prüfen, ob sie in Ordnung sind

if(names.empty())
    return true; // empty vector sorted correctly
for(std::vector<std::string>::iterator i=names.begin(), j=i+1; 
        j != names.end(); 
        ++i, ++j)
    if(*i > *j)
        return false;
return true; // sort verified

Insbesondere konnte std::string::compare nicht als Vergleicher verwendet werden, da er nicht das tut, was sort tun soll: Geben Sie true zurück, wenn das erste Argument kleiner als das zweite ist, und andernfalls false. Wenn Sie sort wie oben verwenden, wird nur operator< verwendet, was genau das tut (d. H. std::string gibt first.compare(second) < 0 zurück).

Was genau ist die Frage? Es scheint, dass alles schon da ist.

Sie sollten jedoch wahrscheinlich std::cout << *i << std::endl; verwenden.

  1. i ist ein Iterator ==-Zeiger auf die Daten im Container, daher ist * erforderlich
  2. c_str() ist eine Funktion von std::string und keine Variable

Die Probleme in Ihrem Code beziehen sich nicht auf Ihre Frage?

Einige Hinweise für Sie:

  • std::vector überschreibt auch den []-Operator, sodass Sie stattdessen den Ärger des Iterators speichern und als Array verwenden können (iterieren Sie von 0 bis vector.size()).
  • Sie können stattdessen std::set verwenden, der beim Einfügen automatisch sortiert wird (binärer Baum), sodass Sie die zusätzliche Sortierung speichern.
  • Die Verwendung eines Funktors macht Ihre Ausgabe noch mehr Spaß: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
3
ypnos

Zum Sortieren:
std::sort Oder std::vector< std::string>::sort(..) Methode.
So überprüfen Sie, ob es sortiert ist:
Verwenden Sie std::is_sorted für die Prüfung ist sortiert - http://www.sgi.com/tech/stl/is_sorted.html
oder
std::adjacent_find( v.begin(), v.end(), std::greater< std::string >() ) == v.end()

für Ihren Fall können Sie den Standardkomparator verwenden

EDITED:
std::is_sorted Ist keine Standard-STL-Funktion, sondern in der SGI-STL-Implementierung definiert.
Danke an Brian Neal für diesen Hinweis.

2
bayda

litb ist wie immer korrekt.

Ich wollte nur auf den allgemeineren Punkt hinweisen - etwas das mit <vergleichbar ist, kann mit std :: sort sortiert werden. Manchmal schleiche ich eine Operator-Member-Funktion in eine struct, nur damit ich dies tun kann.

2
Mark Ransom

Versuchen Sie es mit einem Vergleicher:

 #include <cmath>
 #include <cstdio>
 #include <vector>
 #include <iostream>
 #include <algorithm>
 using namespace std;

//comparing function only sorts if string size is equal and keeps the larger integgers at last.
bool myfunction (string i,string j) 
{ 
int n=i.length();
int m=j.length();
if(n==m)
    return (i<j);

return n<m;   
  }


int main() {
int n;
cin>>n;
vector <string> arr(n);
for(int i=0;i<n;i++)
    cin>>arr[i];


sort(arr.begin(),arr.end(),myfunction);

for(int i=0;i<n;i++)
    cout<<arr[i]<<endl;

return 0;
 }
0
Ashish Kapil

Sie könnten einen std::set verwenden, der natürlich ein sortierter Container ist.

0
Joe

Sortierung der Zeichenfolge:

using namespace std; // to avoid using std everywhere 
std::sort(data.begin(), data.end()); // this will sort the strings

Prüfen, ob der Vektor sortiert ist:

if(vec.empty())
    return true; // empty vector is sorted correctly
for(std::vector< std::string>::iterator i=vec.begin(), j=i+1; j != vec.end(); ++i, ++j)
    if(*i > *j)  return false;
return true; // sort verified

C++ 11 Methode zum Überprüfen des sortierten Vektors:std::is_sorted(vec.begin(),vec.end())

Jetzt den sortierten Vektor drucken:

   for(std::vector< std::string>::iterator i = vec.begin(); i != vec.end(); ++i)
{
    std::cout<< *i <<std::endl;
}
0
abe312