Je dois copier std::set
to std::vector
:
std::set input; input.insert(5); input.insert(6); std::vector output; std::copy(input.begin(), input.end(), output.begin()); //Error: Vector iterator not dereferencable
Où est le problème?
Vous devez utiliser un back_inserter
:
std::copy(input.begin(), input.end(), std::back_inserter(output));
std::copy
n’ajoute pas d’éléments au conteneur dans lequel vous insérez: il ne peut pas; il n’a qu’un iterator dans le conteneur. De ce fait, si vous transmettez un iterator de sortie directement à std::copy
, vous devez vous assurer qu’il pointe vers une plage suffisamment grande pour contenir la plage d’entrée.
std::back_inserter
crée un iterator de sortie qui appelle push_back
sur un conteneur pour chaque élément, afin que chaque élément soit inséré dans le conteneur. Vous pouvez également créer un nombre suffisant d’éléments dans le std::vector
pour contenir la plage en cours de copie:
std::vector output(input.size()); std::copy(input.begin(), input.end(), output.begin());
Ou, vous pouvez utiliser le constructeur std::vector
range:
std::vector output(input.begin(), input.end());
Utilisez simplement le constructeur du vecteur qui prend les iterators:
std::set s; //... std::vector v( s.begin(), s.end() );
Supposons que vous vouliez simplement le contenu de s dans v, et il n’y a rien dans v avant de lui copier les données.
voici une autre alternative utilisant vector::assign
:
theVector.assign(theSet.begin(), theSet.end());
Vous n’avez pas réservé suffisamment d’espace dans votre object vectoriel pour contenir le contenu de votre ensemble.
std::vector output(input.size()); std::copy(input.begin(), input.end(), output.begin());
std::copy
ne peut pas être utilisé pour insérer dans un conteneur vide. Pour ce faire, vous devez utiliser un insert_iterator comme ceci:
std::set input; input.insert(5); input.insert(6); std::vector output; std::copy(input.begin(), input.end(), inserter(output, output.begin()));