non capisco il motivo per cui questo codice è precisoalgoritmo di copia con back_inserter
vector<int> coll;
coll.reserve(2*coll.size());
copy (
coll.begin(), coll.end(), // zrodlo
back_inserter(coll) // przeznaczenie
);
coll.end()
rappresenta la fine del vettore. Dopo aver premuto push_back (come fa back_insert_iterator
) cosa restituisce coll.end()
è lo stesso cosa era prima o qualcosa di diverso? Esistono più di un iteratore di terminazione? Perché end() può essere utilizzato come fine del contenitore anche quando vengono aggiunti nuovi contenuti?
Inoltre, non è possibile applicare il codice all'elenco contenitore: si blocca. Questo è importante perché in caso di vettore push_back rende inattendibili gli iteratori dopo la riallocazione dei dati (quando sono chiamati size()==capacity()
e push_back()
) mentre in caso di elenco non è il caso. Del perché il codice si blocca per la lista?
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);
}
So che non c'è alcuna riserva() nell'elenco. Ho provato il codice per la lista. Il programma entra in un ciclo infinito. –
Puoi mostrarci un [SSCCE] (http:/sscce.org) del codice che hai usato per testarlo sulla lista? –
sscce aggiunto alla domanda –