Nie rozumiem dlaczego ten kod jest dokładnekopia algorytm back_inserter
vector<int> coll;
coll.reserve(2*coll.size());
copy (
coll.begin(), coll.end(), // zrodlo
back_inserter(coll) // przeznaczenie
);
coll.end()
oznacza koniec wektora. Po tym, jak puszczam cokolwiek (co robi back_insert_iterator
), co zwraca coll.end()
jest tym samym, co było wcześniej lub czymś innym? Czy istnieje więcej niż jeden iterator kończący? Dlaczego metoda end() może być używana jako koniec kontenera, nawet po dodaniu nowej treści?
Co więcej, nie można zastosować kodu do kontenera listy - utknie. Jest to ważne, ponieważ w przypadku wektora push_back powoduje, że iteratory są niewiarygodne po ponownym przydzieleniu danych (gdy wywoływane są size()==capacity()
i push_back()
), podczas gdy w przypadku listy tak nie jest. Niż dlaczego kod wisi na liście?
Edycja: (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);
}
Wiem, że nie ma rezerwy() na liście. Próbowałem kodu dla listy. Program przechodzi w nieskończoną pętlę. –
Czy możesz pokazać nam [SSCCE] (http:/sscce.org) kodu użytego do przetestowania tego na liście? –
dodano sscce do pytania –