web-dev-qa-db-fra.com

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.

77
Amir Saniyan

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à le dernier élément.

124
Fred Foo

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 +). +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 });
101
Dietmar Kühl

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)
13
Rafał Rawicki

Au lieu de tout forcer dans un vecteur, demandez-vous 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 préserver la compatibilité (et gérer gratuitement les autres conteneurs 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));
}

Ce qui vous permet de faire:

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

( démo Ideone )

7
Flexo