Quelle est la manière la plus simple de convertir un tableau en vecteur?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
Je veux convertir x du tableau int en vecteur de la manière la plus simple.
Utilisez le vector
constructeur qui prend deux itérateurs, notez que les pointeurs sont des itérateurs valides et utilisez la conversion implicite de tableaux en pointeurs:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);
ou
test(std::vector<int>(x, x + sizeof x / sizeof x[0]));
où sizeof x / sizeof x[0]
est évidemment 3
dans ce contexte; c'est la manière générique d'obtenir le nombre d'éléments dans un tableau. Notez que x + sizeof x / sizeof x[0]
pointe un élément au - delà du dernier élément.
vector<int> a(5,10);
signifiemake room for 5
int` et je les initialise avec 10. Mais comment fonctionne votre x, x + ...? peux-tu expliquer?vector<int>::vector(size_type, int)
, il sélectionnevector<int>::vector(int*, int*)
, qui copie la plage indiquée par cette paire de pointeurs. Le premier est la surcharge (2), le second est la surcharge (4) icisizeof x / sizeof x[0] == std::extent<decltype(x)>::value
Personnellement, j'aime assez l'approche C ++ 2011 car elle ne vous oblige ni à utiliser
sizeof()
ni à vous souvenir d'ajuster les limites du tableau si jamais vous changez les limites du tableau (et vous pouvez définir la fonction appropriée dans C ++ 2003 si vous le souhaitez, aussi ):De toute évidence, avec C ++ 2011, vous souhaiterez peut-être utiliser les listes d'initialiseurs de toute façon:
la source
std::vector<T>
possède toujours lesT
objets. Cela a deux implications: lors de l'insertion d'objets dans un vecteur, ils sont copiés et ils sont colocalisés en mémoire. Pour des objets raisonnablement petits, par exemple des séquences de chaînes courtes, la colocalisation est un gain de performance majeur. Si vos objets sont volumineux et coûteux à copier, vous souhaiterez peut-être stocker des pointeurs [gérés en quelque sorte par les ressources] vers les objets. L'approche la plus efficace dépend des objets mais vous avez le choix.Les pointeurs peuvent être utilisés comme n'importe quel autre itérateur:
la source
const size_t X_SIZE = 3;
pour indiquer la taille du tableau ou en le calculant à partir de sizeof. J'ai omis cette partie pour des raisons de lisibilité.Vous posez la mauvaise question ici - au lieu de tout forcer dans un vecteur, demandez comment vous pouvez convertir le test pour qu'il fonctionne avec des itérateurs au lieu d'un conteneur spécifique. Vous pouvez également fournir une surcharge afin de conserver la compatibilité (et gérer d'autres conteneurs en même temps gratuitement):
devient:
Ce qui vous permet de faire:
( Démo Ideone )
la source
Un moyen simple peut être d'utiliser une
assign()
fonction prédéfinie dans lavector
classe.par exemple
la source