Je ne comprends pas pourquoi ce code est exactalgorithme de copie avec back_inserter
vector<int> coll;
coll.reserve(2*coll.size());
copy (
coll.begin(), coll.end(), // zrodlo
back_inserter(coll) // przeznaczenie
);
coll.end()
représente la fin du vecteur. Après avoir push_back quoi que ce soit (comme le fait back_insert_iterator
) ce que coll.end()
renvoie est le même qu'avant ou quelque chose de différent? Y a-t-il plus d'un itérateur de terminaison? Pourquoi end() peut-il être utilisé comme fin de conteneur même lorsque de nouveaux contenus sont ajoutés?
En outre, vous ne pouvez pas appliquer le code à la liste conteneur - il reste bloqué. Ceci est important car dans le cas d'un vecteur, push_back rend les itérateurs peu fiables après réallocation des données (lorsque size()==capacity()
et push_back()
sont appelés) alors que dans le cas d'une liste, ce n'est pas le cas. Alors pourquoi le code se bloque pour la 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);
}
Je sais qu'il n'y a pas de réserve() dans la liste. J'ai essayé le code pour la liste. Le programme entre dans une boucle sans fin. –
Pouvez-vous nous montrer un [SSCCE] (http:/sscce.org) du code que vous avez utilisé pour tester cela sur la liste? –
sscce a été ajouté à la question –