Comment initialiser un vecteur en C++ [dupliquer]

possible Duplicate:

C++: la façon la plus facile 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};

ou

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

il donne une erreur:

principale expression attendue avant ' {'token

et

erreur:‘, ’ or ‘;’ before ‘=’ token

respectivement.

178
demandé sur Peter Mortensen 2012-01-18 11:22:46

2 réponses

avec le nouveau standard C++ (il peut être nécessaire d'activer des options spéciales 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 initialiseur) pourtant 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 affectation à 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 pour avoir les fonctions qui vous 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 alors vous pouvez le faire sans avoir à répéter la taille partout:

int vv[] = { 12,43 };
std::vector<int> v(begin(vv), end(vv));
245
répondu R. Martinho Fernandes 2012-01-18 09:45:38

, Vous pouvez aussi faire comme ceci:

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 l'utiliser comme ceci:

std::vector<int> v = make_vector<int>() << 1 << 2 << 3;
28
répondu Viktor Sehr 2012-01-18 08:47:19