2016-11-10 2 views
0

Also ich eine Karte von Werten habe, zum Beispiel:Speicher von Werten aus einem bestimmten Bereich in einer Karte

1 3 5 7 9 

Mit meinem aktuellen Code, ich bin derzeit in der Lage, die Anzahl der Vorkommen zwischen einem bestimmten Bereich zu finden von [niedrig, hoch]. Zum Beispiel, wenn ich hatte [3, 7] würde ich den Wert bekommen 3.

Meine aktuellen Code sieht wie folgt aus:

// map::lower_bound/upper_bound 
#include <iostream> 
#include <map> 
using namespace std; 

int main() 
{ 
    map<long,deque<my_struct>> my_map; 
    deque<my_struct> results; 

    mymap[12345].push_back(some_obj); 
    mymap[23456].push_back(some_obj); 
    mymap[34567].push_back(some_obj); 
    mymap[45678].push_back(some_obj); 

    auto low = my_map.lower_bound (12345); 
    auto high = my_map.upper_bound (34567); 

    int num = 0; 
    for (auto it = low; it != high; ++it){ 
     ++num; 
     //how to insert into my results deque? 
    } 
    cout << num << " found\n"; //3found 
    return 0; 
} 

Meine Frage ist: Wie kann ich die drei Objekte in diesem Beispiel das gibt es zwischen niedrig und hoch? Ich möchte diese 3 Objekte in der "Ergebnisse" -Deque speichern, damit ich weiß, was ich in diesem bestimmten Bereich gefunden habe. Ich weiß, dass ich 3 Objekte von my-struct einfügen möchte, aber es fällt mir schwer, die Syntax herauszufinden. Irgendwelche Tipps oder Hilfe würden geschätzt werden !!

Edit: Der Versuch, die neue Methode

using namespace std; 

struct my_struct{ 
    string value; 
}; 

int main() 
{ 
    map<long,deque<my_struct>> my_map; 
    deque<my_struct> results; 

my_struct entrya; 
entrya.value = "today is a great day"; 

my_struct entryb; 
entryb.value = "today is an okay day"; 

my_struct entryc; 
entryc.value = "today is a bad day"; 


my_map[12345].push_back(entrya); 
my_map[23456].push_back(entryb); 
my_map[34567].push_back(entryc); 


auto low = my_map.lower_bound (12345); 
auto high = my_map.upper_bound (34567); 

int num = 0; 
for (auto it = low; it != high; ++it){ 
    ++num; 
    results.insert(results.back(), it->second.begin(), it->second.end()); 
    //how to insert into my results deque? 
} 
cout << num << " found\n"; //3found 

cout << "testing results\n"; 
for (int i = 0; i < results.size(); i++){ 
    cout << results[i].value << "\n"; 
} 
return 0; 

}

bearbeiten zu verwenden: https://gyazo.com/4960e067252f23ffafb924fa8e6693eb

Antwort

2

Die lower_bound und upper_bound Funktionen geben eine Karte Iterator, pic Version so was bist du wirklich fragt, wie man über einen Iterator auf das in einer Map gespeicherte Objekt zugreifen kann.

Der Iterator für Karten zeigt auf std::pair, wobei das erste Element der Schlüssel und das zweite Element der Wert ist. Um also Ihre gespeicherten Werte zu erhalten, verwenden Sie it->second.

Da der Werttyp in der Karte tatsächlich eine std::deque<my_struct> ist, möchten Sie vermutlich alle Daten in die einzige Deque results verketten. Sie können dies mit std::deque::insert Funktion wie folgt tun:

//how to insert into my results deque? 
results.insert(result.end(), it->second.begin(), it->second.end()); 
+1

Oh danke für die Korrektur. Ich war ein bisschen faul, als ich das Codebeispiel las. – paddy

+0

Hallo Leute, ich habe immer noch ein paar Probleme mit @ 1201ProgramAlarms Methode. Ich habe mich gefragt, ob du noch helfen kannst. Die Funktion macht Sinn, ich habe es auf der STL nachgeschlagen. Dennoch verweigert Xcode immer noch die Kompilierung. Ich warf es in eine Bearbeitung auf dem Hauptpost. Weißt du, warum es immer noch scheitern würde? – MMM

+0

vergiss ich habe es! Vielen Dank euch beiden! – MMM

Verwandte Themen