000
08.06.2012, 18:57 Uhr
banshee
|
/edit: Hat sich erledigt, wenn man die innere map jedes mal kopiert, braucht man sich natürlich nicht wundern. Natürlich fällt mir das jetzt 2 Minuten nachdem ich das poste auf, nachdem ich den ganzen Tag schon dran gegrübelt hab
Damit es nicht ganz sinnlos ist: Gibt es vielleicht irgendwelche Tricks, damit man sich solche STL-Container halbwegs übersichtlich im Debugger anschauen kann?
----------------------------------
Hallo,
hier mal wieder ein Problem der Sorte "häääää?"
C++: |
std::map<int, std::multimap<int, Score> >::iterator outerIt;
// iterate x key values for (outerIt = data.begin() ; outerIt != data.end(); outerIt++) { std::multimap<int, Score> innerMap = (*outerIt).second; std::multimap<int, Score>::iterator innerIt;
// iterate y key values for (innerIt = innerMap.begin(); innerIt != innerMap.end(); innerIt++) { // weigh the modality matching scores of this x -> y comparison // and sum it up for (uint j = 0; j < NUM_MODALITIES; j++) matchVal += weights[j] * (*innerIt).second.getValue(j);
// add margin to all comparisons where x != y if( (*outerIt).first != (*innerIt).first) matchVal *= LAMBDA;
(*innerIt).second.setMatchVal(matchVal); matchVal = 0.0; } }
|
Ich vergleiche hier also jeweils zwei Objekte, die durch ganzzahlige Indizes angesprochen werden und speichere einige Ergebnisse über den Vergleich in der Klasse Score. Die Keys der äußeren Map sind also die jeweils ersten Indizes des Vergleichs, die Keys der inneren map die jeweils zweiten Indizes des Vergleichs. Da manche Vergleiche mehrmals durchgeführt werden, ist das innere eine multimap und ich nehme kein 2D-Array.
data ist also die globale verschachtelte map, die ich per Iterator durchlaufe, anschließend die ihr zugeordnete multimap mit einem weiteren iterator. Dann führe ich eine Berechnung durch und will das Ergebnis zurückschreiben.
Komischerweise scheint der Aufruf:
C++: |
(*innerIt).second.setMatchVal(matchVal);
|
das Ergebnis aber nicht zu übernehmen. Wenn ich mir einen anderen Iterator auf dieses Element definiere und im Debugger über diesen Aufruf steppe, wird das Element in diesem zusätzlichen Iterator nicht geändert.
Das kam mir zwar merkwürdig vor, dass man Elemente nicht per Iterator ändern können soll und ich habe mir zu dem Zweck ein kleines Testprojekt erstellt, das so aussieht:
C++: |
int main(int argc, char* argv[]) { Test t; t.setVal(3); testMap.insert(std::pair<int, Test>(1, t));
std::map<int, Test>::iterator it = testMap.begin(); (*it).second.setVal((2));
std::map<int, Test>::iterator it2 = testMap.begin(); std::cout << (*it).second.getVal();
return 0; }
|
Es ist also gewissermaßen das gleiche wie oben isoliert. Die Klasse test verwaltet einen int samt getter und setter, ich initialisiere die map mit einer Klasse Test.wert = 3, versuche den Wert per iterator zu ändern und lasse ihn mit einem weiteren Iterator wieder ausgeben. Komischerweise funktioniert es hier, das Ergebnis ist 2. Warum klappt das also hier und oben nicht und wie muss ich es dann oben machen, damit die Werte innerhalb der map wie gewünscht geändert werden? Dieser Post wurde am 08.06.2012 um 19:13 Uhr von banshee editiert. |