2016-04-08 9 views
0

Ich habe die folgende Art:Wie kann ich auf eine std :: map-Eigenschaft in einem std :: vector-Iterator zugreifen?

typedef std::map<std::string, double> Tick; 

und einen Vektor:

std::vector<Tick> dataSegment; 

Ich möchte durch den Vektor zu durchlaufen und die Summe einer bestimmten Eigenschaft von jeder Karte Artikel berechnen:

double sum = 0.0; 

for (std::vector<Tick>::iterator iterator = dataSegment.begin(); iterator != dataSegment.end(); ++iterator) { 
    sum += iterator->find("close"); 
} 

Wenn ich dies jedoch tue, erhalte ich den folgenden Fehler:

error: invalid operands to binary expression ('double' and 'iterator' (aka '__map_iterator<__tree_iterator, double>, std::__1::__tree_node, double>, void *> *, long> >')) sum += iterator->find("close");

habe ich auch versucht:

for (std::vector<Tick>::iterator iterator = dataSegment.begin(); iterator != dataSegment.end(); ++iterator) { 
    sum += (*iterator).find("close"); 
} 

aber dies erzeugt einen ähnlichen Fehler:

invalid operands to binary expression ('double' and 'iterator' (aka '__map_iterator<__tree_iterator, double>, std::__1::__tree_node, double>, void *> *, long> >')) sum += (*iterator).find("close");

+0

'sf :: map :: find' gibt einen Iterator zurück, keinen Wert. – Hiura

+0

Ah! Das stimmt, schauen Sie sich die Dokumentation an. Wie würde ich auf eine Immobilie zugreifen? –

+1

Durch die Deferenzierung. – Hiura

Antwort

2

std::map::find einen Iterator zurückgibt. Falls Sie Fragen benutzen möchten, müssen Sie es zuerst überprüfen:

auto mit = iterator->find("close"); 
if (mit != iterator->end()) { 
    sum += mit->second; 
} 

Auf der anderen Seite, Sie operator[] stattdessen verwenden könnte (die Standardwerte in die Karte eingefügt wird, wenn der Schlüssel nicht gefunden wird):

sum += (*iterator)["close"]; 
+0

Schön! '(* iterator) [" close "]' hat den Trick gemacht. Vielen Dank! –

+1

Die Methode 'at (const Key & key)' fügt kein neues Element ein, wenn es nicht gefunden wird. Es wird 'std :: out_of_range' werfen http://en.cppreference.com/w/cpp/container/map/at (C++ 11 und höher) – Ceros

+0

Guter Aufruf mit' .at() '. Ich werde es versuchen. –

Verwandte Themen