Ich verstehe nicht, warum dieser CodeKopie Algorithmus mit back_inserter
vector<int> coll;
coll.reserve(2*coll.size());
copy (
coll.begin(), coll.end(), // zrodlo
back_inserter(coll) // przeznaczenie
);
coll.end()
stellt das Ende des Vektors genau ist. Nachdem ich irgendwas gepush_back (wie back_insert_iterator
tut) was coll.end()
zurückgibt ist das gleiche, was vorher war oder etwas anderes? Gibt es mehr als einen abschließenden Iterator? Warum kann end() als Containerende verwendet werden, auch wenn neuer Inhalt hinzugefügt wird?
Darüber hinaus können Sie den Code nicht auf Listencontainer anwenden - es bleibt hängen. Das ist wichtig, weil im Falle des Vektors push_back Iteratoren nach der Neuzuordnung von Daten unzuverlässig macht (wenn size()==capacity()
und push_back()
genannt werden), während dies im Falle einer Liste nicht der Fall ist. Dann warum hängt der Code für die Liste?
Edit: (sscce)
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
typename T::const_iterator pos;
std::cout << optcstr;
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
std::cout << *pos << ' ';
}
std::cout << std::endl;
}
int main(){
list<int> coll;
list<int>::iterator end = coll.end();
copy (
coll.begin(), coll.end(), // zrodlo
back_inserter(coll) // przeznaczenie
);
cout << *end << endl;
PRINT_ELEMENTS(coll);
}
Ich weiß, dass es keine Reserve() in der Liste gibt. Ich habe den Code für die Liste ausprobiert. Das Programm gerät in eine Endlosschleife. –
Können Sie uns eine [SSCCE] (http:/sscce.org) des Codes, den Sie verwendet haben, um das auf der Liste zu testen? –
sscce zu Frage hinzugefügt –