110 votes

Quel est le moyen le plus simple de convertir un tableau en vecteur?

Quel est le moyen le 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 de tableau int en vecteur de la manière la plus simple.

157voto

larsmans Points 167484

Utilisez le constructeur vector qui prend deux itérateurs, notez que les pointeurs sont des itérateurs valides et utilisez la conversion implicite des 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]));
 

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.

144voto

Dietmar Kühl Points 70604

Personnellement, j’aime bien l’approche C ++ 2011 car elle ne vous oblige ni à utiliser sizeof() ni à vous rappeler d’ajuster les limites du tableau si vous modifiez un jour les limites du tableau (et que vous pouvez définir la fonction pertinente en C + 3). +2003 si vous voulez aussi):

 #include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));
 

Évidemment, avec C ++ 2011, vous souhaiterez peut-être quand même utiliser les listes d'initialisation:

 std::vector<int> v({ 1, 2, 3, 4, 5 });
 

22voto

Rafał Rawicki Points 10069

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)
 

13voto

Flexo Points 39273

Vous vous posez la mauvaise question ici - au lieu de forcer le tout dans un vecteur demandez comment vous pouvez convertir test fonctionne avec les itérateurs au lieu d'un conteneur spécifique. Vous pouvez fournir une surcharge trop afin de conserver la compatibilité (et de gérer d'autres contenants en même temps):

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

Qui vous permet de le faire:

int x[3]={1, 2, 3};
test(x); // Now correct

(Ideone démo)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X