Das Abspeichern von Werten in eine dynamische Variable nicht möglich



  • Hallo?



  • Hi.



  • Da hilft dir sicher die Klasse std::map weiter.



  • Techel schrieb:

    Da hilft dir sicher die Klasse std::map weiter.

    Wow, hatte es schon mal mit dieser Methode probiert und ist irgendwie in Vergessenheit geraten, dass es funktionieren könnte.
    Jedenfalls jetzt kann ich die Variablen abspeichern aber das Ausgeben funktioniert noch nicht ganz.
    Folgendermaßen sieht es aus:

    std::map <int, int> vehicleids;
    vehicleids[21] = 100;
    
    // Hier soll vehicleids[21] ausgegeben werden
    std::cout<<  <<endl;
    


  • Guck mal in eine C++-Referenz deiner Wahl, zb. cppreference.com, dort kannst du nachgucken, wie std::map funktioniert und was der []-ooerator bei einer solchen tut.



  • Techel schrieb:

    Guck mal in eine C++-Referenz deiner Wahl, zb. cppreference.com, dort kannst du nachgucken, wie std::map funktioniert und was der []-ooerator bei einer solchen tut.

    Danke hab es gefunden.

    Ich will mir jetzt mit simplen Abfragen ausgeben lassen, ob es bestimmte Variablen gibt. Das Komische ist hierbei, dass mir die zweite if-Abfrage nicht ausgegeben wird, obwohl eigentlich alles richtig sein sollte.
    Hier der Code:

    std::map <int, int> vehicleids;
    	vehicleids[21] = 100;
    	vehicleids[33] = 432;
    
    	// Hier soll vehicleids[21] ausgegeben werden 
    	//cout << vehicleids[21];
    
    	auto it = vehicleids.find(221);
    	if (it == vehicleids.end())
    	{
    		cout << "221 not\n";
    	}
    
    	it = vehicleids.find(33);
    	if (it == vehicleids.begin())
    	{
    		cout << "33 yes\n";
    	}
    
    	it = vehicleids.find(111);
    	if (it == vehicleids.end())
    	{
    		cout << "111 no\n";
    	}
    
    	it = vehicleids.find(21);
    	if (it == vehicleids.begin())
    	{
    		cout << "21 yes\n";
    	}
    

    und hier ein Screenshot von dem was ausgegeben wird:
    http://fs5.directupload.net/images/160506/okuvzjfz.png



  • Warum testest du auf begin?



  • manni66 schrieb:

    Warum testest du auf begin?

    hab nach einem Tutorial zu std::map gesucht und das gefunden:
    http://www.cprogramming.com/tutorial/stl/stlmap.html

    Dort wird mit .end() für eine Abfrage die = 0 sein soll benutzt. Daher bin ich davon ausgegangen, dass man mit .begin() abfragt, ob der Wert existiert.
    Liege ich da falsch?



  • Ja, da liegst du falsch. Wenn du dir die Dokumentation zu std:🗺:find ansiehst, dann steht da drin, dass für gefundene Werte der jeweilige Iterator zurückgegeben wird und für nicht gefundene Werte eben der Iterator zum Ende der Map zurückgegeben wird.

    Wenn du also testen willst, ob ein Element in der Map enthalten ist, dann musst du auf Ungleichheit mit .end() testen.



  • ...oder einfach map::count() nehmen!

    if (vehicleids.count(42)) {
        cout << "ist drin\n";
    } else {
        cout << "nix drin\n";
    }
    

    Vorteil: ist kürzer und klarer, besser lesbar, da es klar macht, dass man sich nicht für den Wert in der map interessiert, sondern nur für die Existenz.

    Nachteil: solltest du danach auch noch auf das Element zugreifen wollen, müsstest du das Element erneut suchen.


Anmelden zum Antworten