web-dev-qa-db-fra.com

Comment initialiser un vecteur en C ++

Duplicate possible:
C++: moyen le plus simple d'initialiser un vecteur STL avec des éléments codés en dur

Je veux initialiser un vecteur comme nous le faisons dans le cas d'un tableau.

Exemple

int vv[2] = {12, 43};

Mais quand je le fais comme ça,

vector<int> v(2) = {34, 23};

OR

vector<int> v(2);
v = {0, 9};

cela donne une erreur:

expression primaire attendue avant le jeton '{'

ET

erreur: attendu, ',' ou ';' avant '=' jeton

respectivement.

189
Md Faisal

Avec le nouveau standard C++ (il peut être nécessaire d’activer des indicateurs spéciaux sur votre compilateur), vous pouvez simplement faire:

std::vector<int> v { 34,23 };
// or
// std::vector<int> v = { 34,23 };

Ou même:

std::vector<int> v(2);
v = { 34,23 };

Sur les compilateurs qui ne supportent pas cette fonctionnalité (listes d'initialisation), vous pouvez l'émuler avec un tableau:

int vv[2] = { 12,43 };
std::vector<int> v(&vv[0], &vv[0]+2);

Ou, dans le cas d'une assignation à un vecteur existant:

int vv[2] = { 12,43 };
v.assign(&vv[0], &vv[0]+2);

Comme l'a suggéré James Kanze, il est plus robuste de disposer de fonctions qui donnent le début et la fin d'un tableau:

template <typename T, size_t N>
T* begin(T(&arr)[N]) { return &arr[0]; }
template <typename T, size_t N>
T* end(T(&arr)[N]) { return &arr[0]+N; }

Et puis vous pouvez le faire sans avoir à répéter la taille de part en part:

int vv[] = { 12,43 };
std::vector<int> v(begin(vv), end(vv));
258

Vous pouvez aussi faire comme ça:

template <typename T>
class make_vector {
public:
  typedef make_vector<T> my_type;
  my_type& operator<< (const T& val) {
    data_.Push_back(val);
    return *this;
  }
  operator std::vector<T>() const {
    return data_;
  }
private:
  std::vector<T> data_;
};

Et utilisez-le comme ceci:

std::vector<int> v = make_vector<int>() << 1 << 2 << 3;
29
Viktor Sehr