Löschen des letzten Elementes aus einem Vector schlägt fehl!!



  • hm *hust* ich glaub mein dev-cpp spinnt:

    no match for ` std::_Rb_tree_iterator<std::pair<const varray::key, int>, std::pair<const

    candidates are: std::_Rb_tree_iterator<std::pair<const varray::key, int>, std::pair<const

    im vc6 gehts...

    grüsse steve



  • CarstenJ schrieb:

    i = testmap.erase(i);
    

    Das wird nicht gehen, denn erase gibt bei maps, anders als bei Vector, nicht das nächste Element wieder. Der Iterator ist ungültig.

    testmap.erase(i++);
    

    So gehts....

    jetzt bin ich verwirrt....
    müsste es nicht eher testmap.erase(i--); heissen, sonst überspring ich doch 2 werte 😕

    grüsse steve



  • Ups, entschuldigung, ich hab gerade an einen vector gedacht 🙄



  • müsste es nicht eher testmap.erase(i--); heissen, sonst überspring ich doch 2 werte 😕

    Nein, eben das genau nicht. Du überspringst praktisch nur eine Stelle, und zwar die, die du mit erase gelöscht hast. Damit zeigt der Iterator auf die nächste Stelle und ist somit wieder gültig.



  • naja ich dachte es rückt vielleicht auf...

    irgendwie bin ich aber bei dem code in ne endlosschleife geraten 😕

    grüsse steve



  • Helium schrieb:

    und Btens schneller ist als IF und IF ELSE

    Quatsch.

    Bist Du dir da so verdammt sicher? Ich habs mal durchgecheackt:

    #include <iostream>
    #include <windows.h>
    #include <mmsystem.h>
    #pragma comment(lib, "Winmm.lib")
    
    const __int32 Loop= 2000000000;
    
    DWORD SplitTime( void )
    {
    	static DWORD dwTime= 0;
    
    	DWORD dwNewTime= timeGetTime();
    	DWORD dwRet= dwNewTime - dwTime;
    
    	dwTime = dwNewTime;
    
    	return dwRet;
    }
    
    void testIF_ELSE( void )
    {
    	int Res= 1;
    
    	for (__int32 Count= 0; Count < Loop; ++Count)
    	{
    		if (Res == 0)
    			;
    		else if (Res == 1)
    			;
    		else
    			;
    	}
    }
    
    void testSWITCH( void )
    {
    	int Res = 1;
    	for (__int32 Count= 0; Count < Loop; ++Count)
    	{
    		switch (Res)
    		{
    		case 0:
    			break;
    		case 1:
    			break;
    		default : break;
    		}
    	}
    }
    
    int main(int argc, char* argv[])
    {
    	std::cout << "Loops: " << Loop << std::endl << std::endl;
    
    	SplitTime();
    	testIF_ELSE();
    	std::cout << "testIF_ELSE: " << SplitTime() << "ms" << std::endl;
    
    	SplitTime();
    	testSWITCH();
    	std::cout << "testSWITCH: " << SplitTime() << "ms" << std::endl;
    
    	int x;
    	std::cin >> x;
    	return 0;
    }
    

    Ergebnis:
    6312 ms für IF/ELSE
    5890 ms für Switch!

    Fazit: Bei 2000000000 abfragen liegt switch ganz klar vorne!!!!

    Also nix Quatsch, testen und dann erst Quatsch sagen 😉



  • Ist Optimierung an? Wundert mich, dass da überhaupt was ausgeführt wird...



  • operator void schrieb:

    Ist Optimierung an? Wundert mich, dass da überhaupt was ausgeführt wird...

    Wieso? unter .NET funzt das prima und dem DJGPP



  • MSVC 6.0 Release-Modus:

    testIF_ELSE: 0ms
    testSWITCH: 0ms

    Und das sollte eigentlich jeder Compiler liefern. Zumindest, wenn er nicht im Debug-Modus und mit eingeschalteten Optimierungen arbeitet.



  • oh das wusste ich net, naja streicht einfach mal 1-2 nullen vom int weg 😃


Anmelden zum Antworten