Vecteur STL (réserve) et de copier()
Salutations,
Je suis en train d'effectuer une copie à partir d'un vecteur (vec1) à un autre vecteur (vec2) en utilisant les 2 suivants abrégé de lignes de code (de la pleine application de test qui suit):
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), vec2.begin());
Tandis que l'appel à vec2 définit la capacité du vecteur vec2, la copie de données vers vec2 semble pas remplir les valeurs de vec1 à vec2.
Remplacement de la copie() fonction avec des appels à push_back() fonctionne comme prévu.
Ce qui me manque ici?
Merci pour votre aide. vectest.cpp programme de test suivie par la sortie qui suit.
Compilateur: gcc 3.4.4 sur cygwin.
Nat
/**
* vectest.cpp
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec1;
vector<int> vec2;
vec1.push_back(1);
vec1.push_back(2);
vec1.push_back(3);
vec1.push_back(4);
vec1.push_back(5);
vec1.push_back(6);
vec1.push_back(7);
vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), vec2.begin());
cout << "vec1.size() = " << vec1.size() << endl;
cout << "vec1.capacity() = " << vec1.capacity() << endl;
cout << "vec1: ";
for( vector<int>::const_iterator iter = vec1.begin(); iter < vec1.end(); ++iter ) {
cout << *iter << " ";
}
cout << endl;
cout << "vec2.size() = " << vec2.size() << endl;
cout << "vec2.capacity() = " << vec2.capacity() << endl;
cout << "vec2: ";
for( vector<int>::const_iterator iter = vec2.begin(); iter < vec2.end(); ++iter ) {
cout << *iter << endl;
}
cout << endl;
}
de sortie:
vec1.size() = 7
vec1.capacity() = 8
vec1: 1 2 3 4 5 6 7
vec2.size() = 0
vec2.capacity() = 7
vec2:
Vous devez vous connecter pour publier un commentaire.
Comme indiqué dans d'autres réponses et commentaires, vous devriez utiliser du vecteur des fonctionnalités intégrées pour cela. Mais:
Lorsque vous
reserve()
éléments, le vecteur va allouer suffisamment d'espace pour (au moins?) que de nombreux éléments. Les éléments n'existent pas dans le vecteur, mais la mémoire est prêt à être utilisé. Ce sera alors peut-être accélérerpush_back()
parce que la mémoire est déjà attribué.Lorsque vous
resize()
le vecteur, il va allouer suffisamment d'espace pour ces éléments, mais aussi les ajouter au vecteur.Donc, si vous redimensionnez un vecteur de 100, vous pouvez accéder à des éléments de 0 à 99, mais si vous réservons de 100 éléments, ils ne sont pas insérés pourtant, tout prêt à être utilisé.
Ce que vous voulez, c'est quelque chose comme ceci:
std::back_inserter
est défini dans<iterator>
vec2.assign
ouvec2.insert
à la place... ils sont plus optimisés.vec2.begin()
ne compile pas, mais justevec2
œuvres..., std::back_inserter(vec2));
.Si les vecteurs sont de même type, l'utilisation de la copie de la construction ou de la copie de l'assignation:
Si les vecteurs ne sont pas exactement les mêmes (peut-être une autre allocation ou quelque chose, ou vec1 est un deque), ce que vous voulez vraiment, c'est la gamme à base de constructeur ou de la gamme à base de céder:
Si vous insistez pour le faire avec
std::copy
, la méthode correcte est:Depuis réservant l'espace n'est pas cessible.
copy
œuvres en attribuant à chaque élément à sa nouvelle valeur. Doncvec2.size()
doit être au moins aussi grand quevec1.size()
dans votre cas. L'appel dereserve
ne change en fait un vecteur de taille, de sa capacité.Dans le livre Efficace STL, Scott Meyers fait valoir que presque toutes les utilisations de std::copy pour l'insertion doit être remplacé par basées sur les fonctions de membre. Je vous suggère de vous procurer une copie, c'est une excellente référence!
Pourquoi pas:
vec2 = vec1;
?Changement de réserve pour redimensionner():
Je crois que c'est le correctif que vous avez besoin.
Je ne peux pas vous donner une très bonne description de la différence, mais au fond de réserve() permet de s'assurer que vous avez suffisamment d'espace, et de les redimensionner() en fait insère quelque chose là-bas.
À mon avis, le plus simple est d'utiliser les std::vector::méthode d'insertion:
(voir http://www.sgi.com/tech/stl/Vector.html)