2016-09-26 3 views
0

So habe ich diese Karte mÜbertragung Karte <string, Paar> zum Vektor

typedef pair<int,int>p; 
map<string, p> m; 

Es hält alle Worte in einer Textdatei, und die erste int in dem Paar ist die Frequenz des Wortes und Die zweite ist die Position des ersten Zeichens in der Textdatei. Diese sind alle berechnet und die Karte funktioniert gut.

JEDOCH

Ich brauche sich diese Worte zu drucken, nach Häufigkeit sortiert in absteigender Reihenfolge. Ich brauche den Positionszähler, denn wenn zwei Wörter die gleiche Häufigkeit haben, sollte der erste in der Liste an erster Stelle stehen.

Wie übertrage ich diese Karte in einen Vektor?

Ich versuchte

copy(m.begin(), m.end(), back_inserter(wordList)); 

ohne Erfolg

++++++++++++++++++++++++++++++ +++++++++++++++++++++++

Okay also ich habe wordList zu vector<pair<string, pair<int, int> > > geändert und meine Kopie funktioniert jetzt. Danke Jungs

+0

Was 'wordlist' ist? Erhalten Sie einen Kompilierungsfehler oder Laufzeitprobleme? Welche Fehler haben Sie? Wir können es erraten, aber es wäre besser, wenn Sie es uns sagen würden. – 1201ProgramAlarm

+0

Es ist bereits lexikografisch in der Karte sortiert, wenn man es in einen Vektor verschiebt, ändert sich die Reihenfolge nicht auf magische Weise. – krzaq

+0

Diese Kopie funktioniert, wenn 'wordList' ein' std :: vector >> 'ist. Andernfalls müssen Sie etwas arbeiten, um die Daten in der Karte in ein Formular zu mappen, das im Vektor gespeichert werden kann. – Peter

Antwort

2

Die einfache Methode ist es, eine Struktur mit allen drei Feldern zu erstellen:

struct Record 
{ 
    std::string word; 
    int   count; 
    std::streampos file_position; 
}; 

Weiter ist durch die Karte iterieren, Instanzen der obigen Struktur zu schaffen, so dass sie in und Anhänge an den Vektor Füllung :

std::vector<Record> database; 
for (map<string,p>::const_iterator iter = m.begin(); 
    iter != m.end(); 
    ++iter) 
{ 
    Record r; 
    r.word = iter->first; 
    r.count = iter->second.first; 
    r.file_position = iter->second.second; 
    database.push_back(r); 
} 

Der Vektor ist jetzt gefüllt, sortierte Reihenfolge. Die Reihenfolge kann mithilfe von std::sort() und einer benutzerdefinierten Vergleichsfunktion geändert werden.

0

Hier ist eine etwas teuere Lösung, die die Zeichenfolge Liste unter Bezug auf die Karte sortiert:

// Make word list 
std::vector<std::string> words; 
words.reserve(m.size()); 
for (const auto & p : m) words.push_back(p.first); 

// Sort 
std::sort(
    words.begin(), words.end(), 
    [&m](const std::string & lhs, const std::string & rhs) 
    { return m.find(lhs)->second < m.find(rhs)->second; }); 
+0

[Demo] (https://ideone.com/6DOyIa) –

Verwandte Themen