2009-03-27 2 views
26

Ich habe eine Reihe von Strings, die ich sortieren muss. Ich denke, dass ein std :: Vektor der einfachste Weg wäre, dies zu tun. Allerdings habe ich noch nie zuvor Vektoren verwendet und möchte daher Hilfe.Wie kann ich ein std :: vector <std::string> erstellen und dann sortieren?

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

Danach, wie kann ich durch sie durchlaufen, um zu überprüfen, dass sie sortiert sind?

Hier ist, was 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); 
} 
+0

Bitte lesen Sie diese Antwort: [boost :: sort] [1] [1]: http: // stackoverflow.com/a/14869307/1038233 – Magnetron

Antwort

57

können Sie tun nur

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

Und es wird die Saiten sortieren. durchlaufen sie dann zu prüfen, ob sie in Ordnung sind insbesondere

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 

In, std::string::compare nicht als Komparator verwendet werden könnte, weil es nicht das, was tut sort will es zu tun: Gibt true zurück, wenn das erste Argument ist weniger als die Sekunde, und andernfalls false zurückgeben. Wenn Sie sort wie oben verwenden, wird es einfach operator< verwenden, was genau das tut (d. H. std::string macht es zurück first.compare(second) < 0).

+7

Nur zum Spaß (und ungeprüft): Überprüfen, dass der Vektor sortiert ist, könnte vereinfacht werden, um std :: angrenzende_find (names.begin(), names.end(), std :: größer ()) == names.end() –

+0

@ Éric Malenfant - Ich habe getestet, es funktioniert –

+0

@ Éric Malenfant, schön gemacht –

3

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

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

  1. i ein Iterator ist == Zeiger auf die Daten in dem Behälter, so wird *
  2. benötigt
  3. 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 auch [] Betreiber überschreibt, so dass Sie stattdessen den Iterator Ärger und es wie ein Array verwenden, speichern kann (iterieren 0-vector.size()).
  • Sie könnten std::set stattdessen verwenden, die automatisch beim Einfügen (Binärbaum) sortiert, so dass Sie die zusätzliche Sortierung speichern.
  • einen Funktor Verwendung macht Ihre Ausgabe noch mehr Spaß: copy(V.begin(), V.end(), ostream_iterator<std::string>(cout, "\n"));
2

Für Art Gebrauch:
std::sort oder std::vector< std::string>::sort(..) Methode.
Um zu überprüfen, ob es sortiert wird:
Verwendung std::is_sorted für den Check 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, dass Sie Standard-Komparator

EDITED verwenden:
std::is_sorted ist nicht Standard-STL-Funktion, es definiert in sgi stl-Implementierung.
Danke @Brian Neal für diese Notiz.

+1

Sie sollten nicht auf diese sgi-Website für Informationen über die STL verlassen. Es ist älter als der Standard. is_sorted ist kein Standard. –

+0

bearbeitet, danke, für diesen wichtigen Hinweis. – bayda

+1

korrigieren Sie mich, wenn ich falsch liege: is_sorted ist in C++ hinzugefügt 11 http://en.cppreference.com/w/cpp/algorithm/is_sorted – abe312

2

litb ist korrekt, wie immer.

Ich wollte nur den allgemeineren Punkt Punkt aus - etwas die verglichen werden können mit < mit std :: sort sortiert werden können. Ich schleiche manchmal einen Operator < Member-Funktion in eine Struktur, nur so kann ich dies tun.

0

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

0

Sortieren der string:

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

Überprüfen, ob Vektor sortiert wird:

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 sortiert Vektor zu überprüfen: std::is_sorted(vec.begin(),vec.end())

nun die sortierten Vektor Druck:

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

Ich habe auf Codeblocks und Ideone überprüft und das funktioniert gut. – abe312

+1

Seit C++ 11, überprüft, ob der Vektor sortiert ist, ist einfach 'std :: is_sorted (vec.begin(), vec.end())' –

+0

Sie sollten nicht auf diese sgi-Website für Informationen über die STL verlassen. Es ist älter als der Standard. is_sorted ist kein Standard – abe312