Vector Element löschen



  • Hallo,
    ich möchte von einem Vector Objeckte löschen.

        Node n1(nullptr, data);
        std::vector<Node> list;
        list.push_back(n1);
    
    
    for (std::vector<Node>::iterator it = list.begin(); it != list.end(); ++it) {
    	Node n = *it;
    	list.erase(it);
    }
    

    Bekomme aber folgende Fehlermeldung:
    'Node &Node::operator =(const Node &)': function was implicitly deleted because a data member 'Node::moves' has either no appropriate copy assignment operator or overload resolution was ambiguous



  • Das hat nichts mit MFC zu tun.

    Deine Schleife macht list.clear().



  • @manni66 Wieso macht die Schleife list.clear() ? Ich dachte die wäre nur zum iterieren. Wie würde ich den sonst ein Elemement löschen?


  • Mod

    @member42 sagte in Vector Element löschen:

    @manni66 Wieso macht die Schleife list.clear() ? Ich dachte die wäre nur zum iterieren. Wie würde ich den sonst ein Elemement löschen?

    Was @manni66 sagen will: Deine Schleife will alle Elemente löschen, da sie durch alle Elemente iteriert und erase darauf durchführt. Zumindest würde sie das, nachdem du den Fehler beseitigst (Wozu soll die Fehlerzeile 7 gut sein?). Was effektiv einem clear entspräche, welches deine ganze Schleife durch eine einzelne (funktionierende) Aktion ersetzen würde.

    Falls das nicht das ist, was du willst, dann ist wahrscheinlich dein Beispielcode zu weit von deinem Anwendungsfall entfernt, als das man dir mit den gegebenen Informationen helfen könnte.



  • @SeppJ Auch wenn ich Zeile 7 entferne bekomme ich immer noch die selbe Fehlemeldung. Eigentlich geht es mir darum ein Element an einem bestimmten Index zu löschen, dass mit dem alle Elemente löschen war nur zum Testen.
    Ich habe das ganze jetzt auch noch mit einem integer Vector getestet und da funktioniert es.(Ich frage mich nur warum es mit dem object vector nicht funktioniert)

        for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
    	if (*it % 2 == 0) { // Alle gerade Elemente entfernen
    		v.erase(it);
    	}
      }


  • Der Fehler liegt dann wohl in deiner Node-Klasse.

    Verwendest du dort einen Member mit einer Referenz (so daß der default Assignment-Operator nicht erzeugt werden kann)?



  • @Th69 Ich weiß nicht ganz was du meinst. Meine Node-Klasse sieht jedenfalls so aus:

       class Node {
    
            public:
    	      std::vector<std::vector<int>> board;
    	      Node *previous;
    	
    	     Node(Node *previous, std::vector<std::vector<int>> board);
    	     ~Node();


  • @member42 sagte in Vector Element löschen:

    @SeppJ Auch wenn ich Zeile 7 entferne bekomme ich immer noch die selbe Fehlemeldung. Eigentlich geht es mir darum ein Element an einem bestimmten Index zu löschen, dass mit dem alle Elemente löschen war nur zum Testen.
    Ich habe das ganze jetzt auch noch mit einem integer Vector getestet und da funktioniert es.(Ich frage mich nur warum es mit dem object vector nicht funktioniert)

        for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
      if (*it % 2 == 0) { // Alle gerade Elemente entfernen
      	v.erase(it);
      }
      }
    

    Wenn ich solchen Code sehe, fühle ich mich nie wohl (und du solltest das auch nicht). Mit "solchem Code" meine ich Code, der den Container, über den iteriert wird, während der Iteration modifiziert. Erase beim vector invalidiert Iteratoren ab der Stelle, die entfernt wurde.

    Am einfachsten schaust du dir das erase-remove-Pattern an.



  • Da gibt es aber keinen Member namens moves (wie in der Fehlermeldung angemeckert).

    Dein Code kompiliert aber so: Ideone-Code
    Aber es gibt einen Laufzeitfehler - wegen der von @wob angesprochenen Invalidierung des Iterators.



  • @Th69 Ich habe nirgendwo eine moves Variable. Deswegen verwundert mich die Fehlermeldung auch.

    Hilft diese Fehlermeldung vielleicht noch:
    see reference to function template instantiation 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<_Ty>>> std::vector<_Ty,std::allocator<_Ty>>::erase(std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<_Ty>>>)' being compiled
    1> with
    1> [
    1> _Ty=Node
    1> ]

    "Aber es gibt einen Laufzeitfehler - wegen der von @wob angesprochenen Invalidierung des Iterators."
    Aber bei einem integer vector funktioniert es auch so wie weiter oben. Dann dürfte es doch eigentlich nicht dadran liegen.



  • @member42 sagte in Vector Element löschen:

    @Th69 Ich habe nirgendwo eine moves Variable. Deswegen verwundert mich die Fehlermeldung auch.

    Vielleicht findet der Compiler an dieser Stelle ein ganz anderes ‚Node‘. Benutzt du using namespace? Verwende einen anderen Namen oder einen eigenen Namespace.

    "Aber es gibt einen Laufzeitfehler - wegen der von @wob angesprochenen Invalidierung des Iterators."
    Aber bei einem integer vector funktioniert es auch so wie weiter oben.

    Funktioniert heißt nicht notwendigerweise ist Fehlerfrei.



  • @manni66 sagte in Vector Element löschen:

    @member42 sagte in Vector Element löschen:

    @Th69 Ich habe nirgendwo eine moves Variable. Deswegen verwundert mich die Fehlermeldung auch.

    Vielleicht findet der Compiler an dieser Stelle ein ganz anderes ‚Node‘. Benutzt du using namespace? Verwende einen anderen Namen oder einen eigenen Namespace.

    Ich verstehe nicht was das jetzt mit Namespaces zu tun hat. Ich habe eine Headerdatei und eine Klasssendatei die Node heißt und erstelle daraus meine Objekte. Mir geht es nur um einen einfachen Weg Objekte von einem Vector zulöschen.
    In Java würde ich es ungefähr so schreiben: liste.remove(liste.indexOf(n1));



  • Ich verstehe nicht

    Genau. Ich habe kein Problem, viel Spaß noch mit deinem...



  • @manni66 Was soll das bitte? Ich bin relativ neu in C++ und habe einfach nur eine ganz normale Nachfrage gestellt(weil ich es nicht verstanden habe), was du genau meinst. Wenn das hier unter deinem Niveau ist, dann ignoriere es doch einfach.
    Ich habe jetzt eine Lösung gefunden, wobei ich erst über den Vector iteriere und erst am Ende das Elment entferne:

        void removeNode(std::vector<Node> &list, int index) {
    
          std::vector<Node>::iterator removeNode;
          int i = 0;
    
          for (std::vector<Node>::iterator it = list.begin(); it != list.end(); ++it) {
    	     i++;
    	    Node n = *it;
    
    	if (index == i) {
    		removeNode = it;
    		break;
    	}
    }
    
       list.erase(removeNode);
     }

  • Mod

    Siehe hier, insbesondere den zweiten Teil:
    https://www.c-plusplus.net/forum/topic/200753/du-brauchst-hilfe
    Dein geposteter Code hat nur vage mit dem Code zu tun, der bei dir den Fehler verursacht. Das daraus folgende Ratespiel möchte sich niemand antun. Du bist am Zug, eine nachvollziehbare Problembeschreibung abzugeben.


Log in to reply