Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Werte in Map bearbeiten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.06.2012, 09:10 Uhr
Tommix



'Morgen,


Zitat von banshee:
Gibt es vielleicht irgendwelche Tricks, damit man sich solche STL-Container halbwegs übersichtlich im Debugger anschauen kann?


Du schreibst nicht, in welchem Debugger. VC++ zeigt das eigentlich ganz brauchbar an:

C++:
#include <map>

int main()
{
    std::map<int, int> myMap;

    myMap[0] = 1;
    myMap[1] = 2;

    return 0;
}


wird zu

Code:
-  myMap  [2]((0, 1),(1, 2))    
std::map<int,int,std::less<int>,std::allocator<std::pair<int const ,int>>>
   [comp]    less    std::less<int>
+  [0]    (0, 1)    std::pair<int const ,int>
+  [1]    (1, 2)    std::pair<int const ,int>


(als Tabelle etwas schöner).
Gruß, Tomix

Dieser Post wurde am 09.06.2012 um 09:13 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.06.2012, 15:10 Uhr
banshee



Benutze derzeit eclipse unter ubuntu, da siehts so aus:


Code:
Name : myMap
    Details:{_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, int> > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<int, int, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = 4196163, _M_parent = 0x7fff00000001, _M_left = 0x401ae5, _M_right = 0x7fffffffdc38}, _M_node_count = 4201120}}}
    Default:{...}
    Decimal:{...}
    Hex:{...}
    Binary:{...}
    Octal:{...}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: