<iterator>



  • Mmmm, std::advance ist in <list> oder?
    Gibt mir ne fehler meldung beim compilieren:

    prog3.cpp:41: error: no match for 'operator=' in 'it = std::advance [with
       _InputIterator = std::_List_iterator<int, int&, int*>, _Distance =
       int]((&it), 2)'
    /usr/include/g++/bits/stl_list.h:144: error: candidates are:
       std::_List_iterator<int, int&, int*>& std::_List_iterator<int, int&,
       int*>::operator=(const std::_List_iterator<int, int&, int*>&)
    

    wuerde die advance metode auch bei it=std::advance(list.begin(),1) anstelle von
    it=list.begin()+1 (welches ja nicht geht) gehen?
    (list ist hier nur ein blah, bei mir heist es std::list<int> yl;)



  • std::advance hat gar keinen rueckgabe wert!
    also nur std::advance(it,2);

    Hat noch jemand eine idee zu it=bla.begin()+1?



  • Ähm stimmt, Du hast recht mit dem Rückgabewert. ^^ Das war nur ausm Kopf. 😃
    Definiert ist advance in <iterator>



  • wenn alles nicht geht und ein

    ++it;
    ++it;
    

    auch nicht gehen sollte, warum auch immer, dann die "harte" metdhode

    //wenn gerade zahl, dann ausführen ( 2,4,6 )
    // else NICHTS ! wenn ungerade also ( it = 1,3,4 )
    
    ++it;
    


  • Stellt sich die Frage, ob std::list hier überhaupt das Mittel der Wahl ist, wenn solche Anforderungen benötigt werden. Evtl. wäre std::deque geeigneter. Vorausgesetzt, dass du nicht ständig Elemente in der Mitte einfügen und/oder löschen musst, ist das sogar wahrscheinlich so.



  • ich brauch list, wegen:
    pop_front
    push_back
    sort
    erase
    pop_back
    push_front

    Hab da noch so ne frage offen:

    for(it=yl[k].begin(); it!=yl[k].end() and tmpl.size()!=ym[k]; std::advance(it,2)){
       tmpl.push_back(*it);
       yl[k].erase(it);
    }
    

    Debugger Error:

    Program received signal SIGSEGV, Segmentation fault.
    0x08049ba3 in std::list<int, std::allocator<int> >::erase (this=0xbffff1e0,
        __position=Cannot access memory at address 0x0
    ) at list.tcc:105
    105           __prev_node->_M_next = __next_node;
    

    Sowas hab ich noch nie gesehen...
    Mein Cpp beispiel ist zwar nicht das beste... aber sollte reichen,
    habe es auch schon anders versucht.



  • Green_Ghost schrieb:

    ich brauch list, wegen:
    pop_front
    push_back
    sort
    erase
    pop_back
    push_front

    Und was spricht da gegen deque außer vielleicht ein bisschen erase?



  • Wenn du das Element löschst ist der Iterator natürlich auch nicht mehr gültig.

    Green_Ghost schrieb:

    [cpp]
    for(it=yl[k].begin(); it!=yl[k].end() and tmpl.size()!=ym[k]; std::advance(it,2)){
    tmpl.push_back(*it);
    it = yl[k].erase(it);
    }
    [/cpp]

    edit: deque



  • weil es keine reference unter http://www.cppreference.com/ gibt.
    Wie soll ich sonst wissen wie ich deque benutzen soll?



  • oder hier
    http://www.cppreference.com/cppdeque/
    Es gibt dort also doch eine Referenz.



  • Was soll da besser sein als bei list?
    list hat noch sort, wobei <algorithm> auch sort hat...



  • deque hat die Vorteile eines Vektors. Z.B. ist die sort-Funktion um Meilen schneller.



  • Vor allem mal hat deque Random-Access-Iteratoren, deren Fehlen ja das eigentliche Problem bei der Aufgabenstellung war 😉
    Für die angegebenen Aufgabengebiete ist deque in jedem Fall verwendbar und folglich wohl die bessere Alternative.


Anmelden zum Antworten