wie funktioniert ein const interartor?



  • Hallo, ich verwende folgenden const_iterator in meiner for loop

    std::vector<std::map<int,double>>::const_iterator i = mymap.begin()
    

    kann ich damit elemente aus der map mit

    i->erase( at );
    

    löschen?

    Funktioniert das const nur auf dem iterator oder sind damit auch Objekte innerhalb der map const geschützt?

    Danke!



  • Ich habe es jetzt mal mit

    for each( const std::map<int,double> &i in myMap)
    

    probiert. Damit kann ich logischerweise nichts mit i.erase( at ) löschen. Wenn ich den const qualifier wegnehme

    for each( std::map<int,double> &i in myMap)
    

    bekomme ich eine compilierfehlermeldung, dass der const qualifier gefälligst drin bleiben sollte...

    Warum kann nun for each nicht ohne const iterieren?



  • container<T>::const_iterator entspricht sozusagen iterator< const T >.
    Also entspricht dein i iterator< const map<...> >. Da erase keine const-Methode von map ist, kannst du sie über den Iterator nicht aufrufen.



  • Was willst du erreichen? (Lies mal den ersten Link in meiner Signatur...)
    for each( const std::map<int,double> &i in myMap) ist kein gültiges C++ - dein Compiler spuckt da garantiert ganz andere Fehlermeldungen als du angibst.
    ein const_iterator ist das äquivalent zum pointer to const, also beispielsweise const map<int, double> * .


  • Mod

    pumuckl schrieb:

    ein const_iterator ist das äquivalent zum pointer to const, also beispielsweise const map<int, double> * .

    Trotzdem ist komischerweise ein erase mit einem const-Iterator in C++98 nicht erlaubt, was konzeptuell irgendwie komisch ist. In C++11 wurde dies zum Glück geändert. Ich musste jedoch gerade überrascht feststellen, dass der GCC 4.8 diese Änderung noch nicht umgesetzt hat 😞 .

    P.S.: Das ist ein bekannter Bug, der in der neuesten Version behoben sein sollte.



  • pumuckl schrieb:

    Was willst du erreichen? (Lies mal den ersten Link in meiner Signatur...)
    for each( const std::map<int,double> &i in myMap) ist kein gültiges C++ - dein Compiler spuckt da garantiert ganz andere Fehlermeldungen als du angibst.
    ein const_iterator ist das äquivalent zum pointer to const, also beispielsweise const map<int, double> * .

    Ich verstehe gerade nicht was du meinst aber folgendes geht einwandfrei unter VS2010

    for each( const std::map<int,i3m::Point2D> &i in myVec )
    

    Vielleicht beziehst du dich auf die zuvor doofe Bezeichnung "myMap", die natürlich nicht nicht sinnvoll gewählt war, weil es sich um einen vector handelt der map Elemente hält.

    Ich wollte durch den vector iterieren und gewisse map elemente verändern/löschen können. Daher wollte ich so etwas:

    for each( std::map<int,i3m::Point2D> &i in myVec )
    

    Ich weiß dass es mit ner normalen for schleife geht, die habe ich auch vorher benutzt.. die zweite Frage war daher ob es auch mit einer for each geht.


  • Mod

    aasdsad schrieb:

    pumuckl schrieb:

    Was willst du erreichen? (Lies mal den ersten Link in meiner Signatur...)
    for each( const std::map<int,double> &i in myMap) ist kein gültiges C++ - dein Compiler spuckt da garantiert ganz andere Fehlermeldungen als du angibst.
    ein const_iterator ist das äquivalent zum pointer to const, also beispielsweise const map<int, double> * .

    Ich verstehe gerade nicht was du meinst aber folgendes geht einwandfrei unter VS2010

    for each( const std::map<int,i3m::Point2D> &i in myVec )
    

    Niemals compiliert das. Das hat eine gewisse Ähnlichkeit mit C++/CLI, eventuell auch C# mit Tippfehlern. Machst du C++/CLI statt C++? Das sind zwei verschiedene Sprachen! (Wird jedoch von Microsoft als C++ verkauft, daher kann es sein, dass hier von Visual Studio verwirrt wurdest).

    Vielleicht beziehst du dich auf die zuvor doofe Bezeichnung "myMap", die natürlich nicht nicht sinnvoll gewählt war, weil es sich um einen vector handelt der map Elemente hält.

    Wenn du in einem Internetforum fremden Leuten Fragen stellst, ist es ganz nützlich, auf absichtlich verwirrende Bezeichner zu verzichten 😉 , findest du nicht?

    Ich weiß dass es mit ner normalen for schleife geht, die habe ich auch vorher benutzt.. die zweite Frage war daher ob es auch mit einer for each geht.

    Fangen wir noch einmal von vorne an: Was möchtest du genau wissen? Zeige bitte alle relevanten Teile des Quellcodes, auf den sich deine Frage bezieht. Quelltexte kopieren, nicht abschreiben, vorher prüfen, ob sie auch wirklich funktionieren (bzw. im Fehlerfall, ob der Fehler auch tatsächlich auftritt). Siehe dazu den ersten und dritten Link in meiner Signatur.



  • aasdsad schrieb:

    Ich verstehe gerade nicht was du meinst aber folgendes geht einwandfrei unter VS2010

    Ich wollte gerade schreiben "sicher nicht", aber dann habe ich es doch mal ausprobiert. Das kompiliert wirklich! 😮 Insbesondere scheint das aber nur mit const& zu funktionieren. Lustig. Um die Verwirrung hier mal zu erklären: C++ kennt keine for each Schleife! each und in sind nicht mal Keywords in der Sprache! Das Äquivalent dazu wäre

    for (auto& e : v)
    

    Microsoft hat sich hier wohl einen Scherz erlaubt. Insbesondere werden in und each auch nur Kontextabhängig als Keyword gehighlightet. Kann man also problemlos als Variablennamen etc. benutzen. Deshalb ist mir das wohl auch noch nie aufgefallen.



  • cooky451 schrieb:

    aasdsad schrieb:

    Ich verstehe gerade nicht was du meinst aber folgendes geht einwandfrei unter VS2010

    Ich wollte gerade schreiben "sicher nicht", aber dann habe ich es doch mal ausprobiert. Das kompiliert wirklich! 😮 Insbesondere scheint das aber nur mit const& zu funktionieren. Lustig. Um die Verwirrung hier mal zu erklären: C++ kennt keine for each Schleife! each und in sind nicht mal Keywords in der Sprache! Das Äquivalent dazu wäre

    for (auto& e : v)
    

    Microsoft hat sich hier wohl einen Scherz erlaubt. Insbesondere werden in und each auch nur Kontextabhängig als Keyword gehighlightet. Kann man also problemlos als Variablennamen etc. benutzen. Deshalb ist mir das wohl auch noch nie aufgefallen.

    Ohje... wie kann es sein wo ich doch gar kein CLI /clr oder sonst was benutze?



  • aasdsad schrieb:

    Ohje... wie kann es sein wo ich doch gar kein CLI /clr oder sonst was benutze?

    Ich denke das ist nicht dein Fehler, denn ich nutze recht sicher kein CLI. Bei VS muss man C++ eben schon können, MS baut da gerne mal kleine "Spracherweiterungen" ein. Leider gibt es meines Wissens nach keinen "-strict-c++" Switch oder Ähnliches. Im Zweifelsfall bei kleinen Unsicherheiten einfach mal versuchen es mit GCC (z.B. auf ideone.com) zu kompilieren. :xmas1:



  • cooky451 schrieb:

    aasdsad schrieb:

    Ohje... wie kann es sein wo ich doch gar kein CLI /clr oder sonst was benutze?

    Ich denke das ist nicht dein Fehler, denn ich nutze recht sicher kein CLI. Bei VS muss man C++ eben schon können, MS baut da gerne mal kleine "Spracherweiterungen" ein. Leider gibt es meines Wissens nach keinen "-strict-c++" Switch oder Ähnliches. Im Zweifelsfall bei kleinen Unsicherheiten einfach mal versuchen es mit GCC (z.B. auf ideone.com) zu kompilieren. :xmas1:

    Danke für den Hinweis. Und ich habe mich schon über eine schöne Syntax beim interieren durch Container gefreut ..

    Ich habe mal

    for( auto &i : myVec )
    

    probiert. Das funktionert auch nicht im VS2010. Er schreibt:

    `

    Error: Reference variable "i" requires an initializer

    `


  • Mod

    Der Microsoft Compiler beherrscht range-based for im C++11-Stil erst ab Version 11. Auch hier kann man nur den GCC (oder Clang) empfehlen, wenn man neue Features schnell implementiert haben möchte. Die konnten das sogar schon bevor der neue Standard Ende 2011 offiziell verabschiedet wurde. Siehe:
    http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport



  • SeppJ schrieb:

    Der Microsoft Compiler beherrscht range-based for im C++11-Stil erst ab Version 11. Auch hier kann man nur den GCC (oder Clang) empfehlen, wenn man neue Features schnell implementiert haben möchte. Die konnten das sogar schon bevor der neue Standard Ende 2011 offiziell verabschiedet wurde. Siehe:
    http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport

    Danke aber VS wird in den Läden die sihc kenne nicht wegen seiner hohen Sprachkompatibilität verwendet 🙂

    Reiner Compilerwechsel bringt nichts. Man verliert eher an Produktivität. Die Modelling/Profiler/Code Coverage/Tests/Debug/Extensions/Makro/Versionierung/TODO Verwaltung/Bookmarks/Watches/Floating Debug Views/... und und und ... Tools sind bei VS alle aus einem Guß und funktionieren so weit in ganz gut. Dafür gibt es kommerzielen Support, ohne dass ich die einzelnen Tools selber entbuggen oder pflegen müsste. Auch müssen keine CMAKE oder sonstige Sprachen gelernt werden, die überhaupt nichts mit dem Projekt zu tun haben. Alles geht schnell per Klick. Wenn ich heute von Propertysheets (Vererbungsprinzip von Projekteigenschaften nach OOP) auf CMAKE Projekte umsteigen müsste ... alleine bei diesem Gedanken dreht sich mir der Magen rum. Manche sollten sich ruhig mal überlegen was sie da empfehlen bevor sie einfach einen Compiler-Wechsel empfehlen. Die C++ Sprache ist (leider) ein Steckenpferd, aber sie ist bei einer modernen Anwendungsentwicklung nur ein ganz kleiner ungewichtiger Teil.

    Zu überlegen wäre auf den Intel C++ Compiler zu wechseln. Der verkrüppelt aber AMD Prozessoren, was ebenfalls keine sinnvolle Alternative ist.

    Ein Wechsel geht vielleicht wenn jemand privat etwas kleines entwickelt ...



  • cooky451 schrieb:

    [...] MS baut da gerne mal kleine "Spracherweiterungen" ein. Leider gibt es meines Wissens nach keinen "-strict-c++" Switch oder Ähnliches.

    Probier mal /Za


  • Mod

    aasdsad schrieb:

    Zu überlegen wäre auf den Intel C++ Compiler zu wechseln. Der verkrüppelt aber AMD Prozessoren, was ebenfalls keine sinnvolle Alternative ist.

    Du bist so etwa auf dem Stand von 2006. Der Rest deiner Ansichten klingt auch eher mythisch oder von anderen Leuten unreflektiert übernommen.



  • SeppJ schrieb:

    aasdsad schrieb:

    Zu überlegen wäre auf den Intel C++ Compiler zu wechseln. Der verkrüppelt aber AMD Prozessoren, was ebenfalls keine sinnvolle Alternative ist.

    Du bist so etwa auf dem Stand von 2006. Der Rest deiner Ansichten klingt auch eher mythisch oder von anderen Leuten unreflektiert übernommen.

    Danke aber ich nutze den Intel Compiler regelmäßig. Wahrscheinlich haben sie auf Druck von Außen den SSE stop herausgenommen, weisen aber nirgendwo darauf hin, dass alle Extensions, die theoretisch auch auf AMD Prozessoren laufen könnten auch umgesetzt werden. Ganz zu schweigen von AMD spezifischen Optimierungen.

    1. Kläre mich auf wenn es anders ist. Am besten mit einem Link worin explizit gesagt wird, dass AMD Prozessoren in Produkten wie MKL in vollem Umfang unterstützt werden.

    2. Bei der Gelegenheit kannst du mir auch sagen was du an den von mir aufgezählten Tools so schlecht findest.

    3. Und wenn du schon dabei bist dann bringe mich auf den neusten Stand der Projektverwaltung. Ein Tool, vergleichbar mit Propertysheets. Ich will Projekteigenschaften zusammenklicken und neue Projekte sollen allesamt davon erben können. Will ich ne DLL, dann möchte ich ohne etwas ändern zu müssen einfach mal von meinem Propertysheet DLL erben. Darin werden alle Projektpfade Compiler/Linker/Build Events eingestellt.

    So sieht es in VS aus: http://imageshack.us/scaled/landing/593/propertysheetsvs2010.png

    Man erstellt einmal ein Property Sheet für alle möglichen externen Bibliotheken und muss sich nie wieder über fehlende includes oder input libs kümmern.

    Das ganze soll mit einem Propertysheet für:
    - Release / x86
    - Release / x64
    - Debug / x86
    - Debug / x64
    - Release / ARM
    - Release / ARM
    - Debug / ARM
    - Debug / ARM

    Für den Output braucht VS nur eine Zeile $(IntDir)$(ProjectName)-vc$(PlatformToolsetVersion)-$(Configuration)-$(PlatformName)$(TargetExt)

    wobei $(IntDir) wieder eine vollständig automatisierte Variable ist: $(ProjectRoot)$(BinPath)\msw\vc\$(PlatformToolset)\$(PlatformName)\$(Configuration)\$(ProjectName)\

    Wobei die includes/libs und alle anderen Compiler/Linker/Signierer Settings automatisch mit erschlagen werden.

    Ohne dass ich irgend eine externe Sprache wie CMAKE muss.

    Ich kenne noch keine andere IDE die so etwas beherrscht, lasse mich aber gerne von meinem 2006 Stand aktualisieren.

    Wobei die meisten hier meckern werden ohne überhaupt zu wissen dass es so etwas seit Jahren gibt während die Foren der SDKs immer wieder mit Include und Link fehlern vollgestopft werden.

    Verstehe mich nicht falsch, ich habe nichts dagegen wenn jemand CMAKE kann und nutzt. Visual Studio wird aber sicherlich nicht aus reinem Unwissen und Unplanung gekauft.

    Außerdem Herr SeppJ fällt es mir nicht das erste mal auf, dass du deine Nase in Sachen reinsteckst wovon du nicht so viel Ahnung hast, obwohl du C++ sprachtechnisch immer einen guten rat gibst.

    Ich erwarte mal deine Antworten für Punkt 1) 2) 3), in einem Guß und ohne eine zusätzliche Sprache lernen zu müssen. Das wird dann mein/dein Stand 2012 sein, von dem wir sicherlich beide profitieren werden.



  • Hier hast du z.B. den Nachweis, dass andere Prozessoren nicht genau so optimiert werden:

    http://software.intel.com/en-us/articles/optimization-notice#opt-en

    Das ist für mich ein klarer Ausschluss den Intel Compiler für allgemeine Non-Numerik Projekte, die mittels PGO auf einen bestimmten Prozessortyp gedrillt sind, zu verwenden.

    Punkt 1) hat sich somit erledigt.


  • Mod

    aasdsad schrieb:

    Ich erwarte mal deine Antworten für Punkt 1) 2) 3), in einem Guß und ohne eine zusätzliche Sprache lernen zu müssen.

    Sonst geht's dir noch gut, oder? Ich lasse mir doch keine Forderungen stellen. Entweder nimmst du meinen kleinen Hinweis an, dass es da vielleicht Fakten geben könnte, die dir nicht bekannt sind und bildest dich selbstständig fort, oder du lässt es.



  • SeppJ schrieb:

    Sonst geht's dir noch gut, oder? Ich lasse mir doch keine Forderungen stellen. Entweder nimmst du meinen kleinen Hinweis an, dass es da vielleicht Fakten geben könnte, die dir nicht bekannt sind und bildest dich selbstständig fort, oder du lässt es.

    Das ist so ziemlich die einzige Antwort die übrig bleibt wenn hinter Anschuldigungen kein fundiertes Wissen steckt. Wenn du eine Antwort parat hättest, dann wäre es nicht schwer das Kind beim Namen zu benennen. So viele IDE's gibt es nämlich nicht. Wenn diese Zahl nochmal eingegrenzt wird, die auch von großen Unternehmen (IBM,...) gepflegt werden, dann reduziert sich diese Zahl noch einmal deutlich. Selbst große Projekte wie Qt setzen beim Build Prozess auf eine make-artige Anwendung aus Mangel an Alternativen, die flexibel genug wären erst einmal die Möglichkeiten von make im Build Prozess abzudecken. Boost kocht in der Hinsicht auch ein ähnliches Süppchen.

    Was ist mit anderen Tools, dass zum Application Lifecycle Management gehört, von der Anforderungsanalyse bis hin zum Ableben der Anwendung? Ich würde mir gerne das Geld sparen. Die einzigen Tools die da brauchbare Ansätze auch wenn nicht scriptfrei und aus einem Guß haben, wären Netbeans und Eclipse.

    Wenn es deine genannten magischen, kostenfreien alles-auf-einmal-abdeckenden Tools gibt, warum werden sie dann nicht in Großprojekten eingesetzt? Sind dortige Programmierer ebenfalls auf dem Stand von 2006?

    Lass es einfach sein, du bist ein Mod, damit solltest du als Beispiel vorangehen. Bevor du jemandem einen 2006 Stand bescheinigst solltest du dein eigenes Wissen auf dem neuesten Stand halten. Du hast weder eine Ahnung über die Beschränkungen des Intel Compiler's noch ein tiefergehendes Verständnis welche Möglichkeiten die Lizensierung (ich meine hier explizit nicht die kostenfreien Express Versionen) von Visual Studio mit sich bringt.

    Sieh es als meinen kleinen Hinweis an 😉 und recherchiere einfach nach. Damit bist du mehr oder weniger gewollt ebenfalls auf den neuesten Stand gebracht worden. Entweder du bildest dich in dieser Hinsicht fort oder lässt es ebenfalls sein und läufst demnächst genau so gegen die Wand.



  • cooky451 schrieb:

    Leider gibt es meines Wissens nach keinen "-strict-c++" Switch oder Ähnliches.

    Doch, den gibt es eigentlich schon: Eigenschaften - C/C++ - Sprache - Spracherweiterungen deaktivieren Ja (/Za).

    Dann kommen auch Fehlermeldungen:
    Error 1 error C2061: Syntaxfehler: Bezeichner 'each'


Anmelden zum Antworten