213 votes

Comment initialiser un vecteur en C++

Je veux initialiser un vecteur comme on le fait 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 :

expression primaire attendue avant le jeton '{'.

ET

erreur : on s'attendait à ce que ',' ou ';' précède le jeton '='.

respectivement.

3 votes

0 votes

Vous devez activer le support C++11 dans votre compilateur, par ex. g++ -std=c++11 your_file.cc . Ensuite, vous pouvez utiliser le constructeur de la liste d'initialisation du fil (le dernier élément de la liste d'initialisation). cette référence )

1 votes

Il ne s'agit pas d'un doublon - l'autre question est de savoir comment le faire avec l'ancien c++, la réponse de WTF est de savoir comment le faire maintenant.

287voto

R. Martinho Fernandes Points 96873

Avec la nouvelle norme C++ (qui peut nécessiter l'activation de drapeaux spéciaux sur votre compilateur), vous pouvez simplement le 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 encore 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, pour le cas de l'affectation à un vecteur existant :

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

Comme James Kanze l'a suggéré, il est plus robuste d'avoir des 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 vous pouvez le faire sans avoir à répéter la taille partout :

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

22 votes

Ou simplement : std::vector<int> v(vv, vv+2) ;

11 votes

Ou de manière plus robuste : std::vector<int> v(begin(w), end(w); . Le site begin y end sont standard en C++11 (mais vous n'en avez pas besoin), mais devraient être dans votre boîte à outils autrement.

2 votes

Je sais que c'est une vieille question, mais que faites-vous exactement ici : std::vector<int> v(&vv[0], &vv[0]+2); ? Ce que je vois, c'est que tu construis un vecteur avec de la place pour &vv[0] (qui sera une adresse mémoire), et de remplir chaque espace du vecteur avec &vv[0]+2 ... Cela reviendrait à utiliser le constructeur 2 de cette page : fr.cppreference.com/w/cpp/container/vector/vector sans fournir le troisième argument, qui est par défaut Allocator(). Je sais qu'il me manque quelque chose.

32voto

Viktor Sehr Points 5634

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 utilise-le comme ça :

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

1 votes

Est-il possible de déplacer données_ a v au lieu d'appeler le constructeur de la copie ?

2 votes

Bonjour Per ! Je suppose que tu fais comme ceci (avertissement, non testé) : operator std::vector<T>&& () { return std::move(data_) ; }

24voto

Shadow Points 2177

Pas de chemin direct mais voir le cinquième vecteur

vector<int> first;                                // empty vector of ints
vector<int> second (4,100);                       // four ints with value 100
vector<int> third (second.begin(),second.end());  // iterating through second
vector<int> fourth (third);                       // a copy of third

// the iterator constructor can also be used to construct from arrays:
int myints[] = {16,2,77,29};
vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

-1voto

Azodious Points 8187

Le programme suivant montre comment utiliser le vecteur :

#include <iostream>
#include <vector>
using namespace std;

int main ()
{
  vector<int> myvector; // initilizes an empty vector.
  int myint;

  cout << "Please enter some integers (enter 0 to end):\n";

  do {
    cin >> myint;
    myvector.push_back (myint);
  } while (myint);

  cout << "myvector stores " << (int) myvector.size() << " numbers.\n";

  return 0;
}

Courtoisie : http://www.cplusplus.com/reference/stl/vector/push_back/

Pour initialiser le vecteur avec des valeurs :

vector<int> vecInitWithInts (10,1); // initilizes first ten indexes with value = 1
vector<int> vecInitWithVector (vecInitWithInts.begin(),vecInitWithInts.end());  // initializes with copy of another vector's values, one by one   
vector<int> vecInitWithVector2 (vecInitWithInts); // initilizes with a vector.

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