C ++, copie définie sur vector

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()));