Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Teiby

Frischling

  • »Teiby« ist der Autor dieses Themas

Beiträge: 42

Beruf: Ausbildung

  • Private Nachricht senden

11

24.10.2011, 18:47

Auf Wiki steht:

Zitat

C++11 provides support for anonymous functions, called lambda functions in the specification.
Naja okay das sagt nur aus das es unterstützt wird.

Ich verwende "Visual C++ 2008 Version 9.0.30729.1 SP" und da gibts beim erstellen jede menge Fehler aus.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

24.10.2011, 18:51

Ja 2008 kann das noch nicht. 2010 aber schon ;)

Teiby

Frischling

  • »Teiby« ist der Autor dieses Themas

Beiträge: 42

Beruf: Ausbildung

  • Private Nachricht senden

13

24.10.2011, 20:44

Okay. Ich hab auch 2010 installiert. Läuft bei mir aber total lahm. Wenn ich im 2010 auf "Gehe zu Deklaration" klicke, dann braucht der manchmal 5-10 Sekunden bis der was findet. Gleiche auch mit "Alle Verweise suchen" und paar anderen Dingen...

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

14

24.10.2011, 22:15

Okay. Ich hab auch 2010 installiert. Läuft bei mir aber total lahm. Wenn ich im 2010 auf "Gehe zu Deklaration" klicke, dann braucht der manchmal 5-10 Sekunden bis der was findet. Gleiche auch mit "Alle Verweise suchen" und paar anderen Dingen...
Bei mir geht alles superfix, könnte aber auch an der SSD und dem Core i5 liegen ; )

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

15

25.10.2011, 11:14

Visual Studio 10 ist bei solchen "Finde Quelle"-Aufgaben wirklich bisweilen hundslangsam. Auch mit SSD und CoreI7. Installiere mal das ServicePack1 von VS2010, damit wird es *etwas* besser. Auch sonst hat VS10 einige Macken, die das VS8 nicht hatte. Aber der Compiler ist Top - hundeschnell, verlässlich und kann einige schöne C++11-Techniken, ohne die ich nicht mehr leben will. Allen voran die oben genannten Lambdas.

Zu Deinem eigentlichen Problem: Iterator-Schleifen, die zwischendrin was löschen sollen, sehen bei mir so aus, wie das dot schon beschrieb: der erase()-Aufruf gibt einen Iterator auf das nächste gültige Element zurück. Das heißt aber auch, dass Du dann in der Schleife nicht mehr so einfach ++it machen darfst, weil Du dann ja im erase-Fall zweimal vorwärts latschst. Probier es stattdessen mal mit sowas:

Quellcode

1
2
3
4
5
6
7
for( auto it = liste.begin(); it != liste.end(); /*nix da*/ )
{
  if( it->Guid == GUID )
    it = liste.erase( it);
  else
    ++it;
}


und es müsste klappen. Man hat mich aber vor ne Weile mal darauf hingewiesen, dass ein erase() mit Iteratorrückgabe eine VisualC-eigene Erfindung ist. Dieser Code kompiliert also auf dem GCC nicht mehr. Die Lösung auf dem GC wäre wahrscheinlich vom Typ des Containers abhängig.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

25.10.2011, 13:22

Man hat mich aber vor ne Weile mal darauf hingewiesen, dass ein erase() mit Iteratorrückgabe eine VisualC-eigene Erfindung ist. Dieser Code kompiliert also auf dem GCC nicht mehr. Die Lösung auf dem GC wäre wahrscheinlich vom Typ des Containers abhängig.

Dann hat man dir Blödsinn erzählt ;)
erase() liefert bei allen Containern (die ein erase() anbieten) den nächsten iterator zurück. Vor dem neuen Standard war das nur bei sequentiellen Containern so. Da war es eine Spezialität von Visual C++, dass z.B. auch std::map::erase() den iterator liefert. Aber nun ist das für jeden Container so.
Btw: Statt container.begin() und container.end(), sollte man nun begin(container) und end(container) verwenden.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

17

25.10.2011, 13:35


Dann hat man dir Blödsinn erzählt ;)
erase() liefert bei allen Containern (die ein erase() anbieten) den nächsten iterator zurück. Vor dem neuen Standard war das nur bei sequentiellen Containern so. Da war es eine Spezialität von Visual C++, dass z.B. auch std::map::erase() den iterator liefert. Aber nun ist das für jeden Container so.

Aha, ok. Gut zu wissen.

Zitat

Btw: Statt container.begin() und container.end(), sollte man nun begin(container) und end(container) verwenden.

Was bringt das?
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

25.10.2011, 13:46

Zitat

Btw: Statt container.begin() und container.end(), sollte man nun begin(container) und end(container) verwenden.

Was bringt das?

Höhere Generizität/Flexibilität. Dein Code geht damit nichtmehr implizit von der Annahme aus, dass es sich bei container um eine Instanz einer Klasse handelt, die Methoden Namens begin() und end() hat, die entsprechende Iteratoren liefern.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

19

25.10.2011, 13:57

Interessant. Ich müsste also, wenn ich einen eigenen Container schreibe, nicht mehr das Iterator-Interface implementieren, sondern könnte auch einfach Überladungen der begin()- und end()-Funktionen mit meinem Container anbieten.

Nette Idee, aber das geht mir ehrlich gesagt dann doch zu weit. Ich mag die Gruppierung von Funktionalität in Klassen. Ich orientiere mich in fremdem Code sehr viel über die Auto Completion. Zuviele freie Funktionen versauen da die Gruppierung von Funktionalität anhand der Typen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

25.10.2011, 14:08

std::begin() und std::end() rufen einfach nur bla.begin() und bla.end() auf und liegen schon fix fertig in der Standardbibliothek, du musst sie nur verwenden. Du musst also nichts selbst schreiben. Der Punkt ist aber: Wenn du deinen Code so schreibst, dann könntest du wenn du wolltest. Vor allem könntest du container problemlos durch etwas völlig andres ersetzen.

Werbeanzeige