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.
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.
Réponses:
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.
sizeof 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 ):
#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));
De toute évidence, avec C ++ 2011, vous souhaiterez peut-être utiliser les listes d'initialiseurs de toute façon:
std::vector<int> v({ 1, 2, 3, 4, 5 });
std::vector<T>
possède toujours les T
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:
int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)
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):
void test(const std::vector<int>& in) {
// Iterate over vector and do whatever
}
devient:
template <typename Iterator>
void test(Iterator begin, const Iterator end) {
// Iterate over range and do whatever
}
template <typename Container>
void test(const Container& in) {
test(std::begin(in), std::end(in));
}
Ce qui vous permet de faire:
int x[3]={1, 2, 3};
test(x); // Now correct
( Démo Ideone )
Un moyen simple peut être d'utiliser une assign()
fonction prédéfinie dans la vector
classe.
par exemple
array[5]={1,2,3,4,5};
vector<int> v;
v.assign(array, array+5); // 5 is size of array.
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?