Element aus std::vector löschen



  • Hallo allerseits,

    ich habe vor ein Element aus einem Vektor zu löschen. Mit dem VC++ habe ich das immer mit einem Pointer auf das zu löschende Objekt und einem Aufruf der 'erase'-Methode gemacht. Der GCC (unter Linux) lässt das aber partout nicht zu. Wie muss der Aufruf standard-konform aussehen?

    Mein momentaner Code sieht so aus

    m_pGroup->m_vOptions.erase(this);
    

    Damit will ich bezwecken, dass alle Elemente aus m_vOptions gelöscht werden, die eben die Speicheradresse des aktuellen Objektes enthalten.

    Vielen Dank für Antworten 🙂



  • Wie lautet denn die Fehlermeldung vom gcc?



  • l_wnd_option.cpp:61: no matching function for call to `
    std::vector<l_wnd_option*, std::allocator<l_wnd_option*> >::erase(
    l_wnd_option* const)'
    /usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_vector.h:647: candidates
    are: __gnu_cxx::__normal_iterator<_Tp*, std::vector<_Tp, _Alloc> >
    std::vector<_Tp, _Alloc>::erase(__gnu_cxx::__normal_iterator<_Tp*,
    std::vector<_Tp, _Alloc> > ) [with _Tp = l_wnd_option*, _Alloc =
    std::allocator<l_wnd_option*>]
    /usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_vector.h:670:
    __gnu_cxx::__normal_iterator<_Tp*, std::vector<_Tp, _Alloc> >
    std::vector<_Tp, _Alloc>::erase(__gnu_cxx::__normal_iterator<_Tp*,
    std::vector<_Tp, _Alloc> >, __gnu_cxx::__normal_iterator<_Tp*,
    std::vector<_Tp, _Alloc> > ) [with _Tp = l_wnd_option*, _Alloc =
    std::allocator<l_wnd_option*>]

    Soviel wie ich da verstehe gibt es keine 'erase'-Methode, die (in diesem Fall) ein l_wnd_option* als Parameter übernimmt. Stattdessen irgendwas mit einem iterator. Aber wie bekomme ich solch einen iterator auf meine l_wnd_option*?



  • std::vector<l_wnd_option*, std::allocator<l_wnd_option*> >::erase(
    l_wnd_option const😉

    [ Dieser Beitrag wurde am 07.07.2003 um 15:57 Uhr von Knuddlbaer editiert. ]



  • m_pGroup->m_vOptions.erase((l_wnd_option* const)this);
    

    funktioniert auch nicht. Ich verstehe die Fehlermeldung eher so, dass ich ein 'l_wnd_caption* const' übergeben will, aber es keine 'erase'-Methode gibt, die ein 'l_wnd_caption* const' nimmt.



  • Hilft vielleicht:

    m_pGroup->m_vOptions.erase(std::remove(m_pGroup->m_vOptions.begin(), 
                                           m_pGroup->m_vOptions.end(),
                                           this),
                               m_pGroup->m_vOptions.end());
    

    bzw. (wenn der Vektor auch real weniger Speicher belegen soll)

    std::vector<l_wnd_option*> temp;
    std::remove_copy(m_pGroup->m_vOptions.begin(), 
                     m_pGroup->m_vOptions.end(),
                     std::back_inserter(temp),
                     this);
    m_pGroup->m_vOptions = temp;
    


  • m_pGroup->m_vOptions.erase((l_wnd_option* const)this);

    Nicht wild casten bevor du nicht das Problem verstanden hast.

    Die erase-Methode von vector erwartet einen vector<T>::iterator. Was sich hinter diesem Typ verbirgt ist nicht vorgeschrieben. Bei der Dinkumware-STL die vom VC mitgeliefert wird, ist vector<T>::iterator nun gerade T*, also ein Pointer vom Elementtyp.

    Viele anderen STL-Implementationen verwenden aber eine Iterator-Klasse (in deinem Beispiel heißt diese __normal_iterator). Und eine solche ist natürlich nicht kompatibel zu einem Pointer (es sei denn sie hat einen entsprechenden Ctor).

    Dein Fehler ist also, dass du dich auf ein Implementationsdetail verlassen hast, auf das du nicht nicht verlassen darfst.


Anmelden zum Antworten