<iterator>
-
Michael E. schrieb:
Warum nicht einfach it+=2?
Weil die Iteratoren bei std::list<T> bidirectional sind und nicht Random-Access wie bei std::vector<T>.
-
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_frontHab 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_frontUnd 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.