122 votes

Comment créer un tableau dynamique d'entiers

Comment créer un tableau dynamique d'entiers en C++ à l'aide de la fonction new mot-clé ?

17 votes

Vous utilisez un std::vector<int> . Et un livre .

0 votes

Comment assigner et accéder à ses données une fois qu'il est initialisé ?

0 votes

Jetez un coup d'oeil à cet article, il est donné en détail pour chaque type de données : programmingtunes.com/dynamic-array-in-c

173voto

Jason Iverson Points 673
int main()
{
  int size;

  std::cin >> size;

  int *array = new int[size];

  delete [] array;

  return 0;
}

N'oubliez pas de delete chaque tableau que vous allouez avec new .

3 votes

8 ans plus tard, ce commentaire pourrait confondre les débutants @GManNickG, pourquoi ne pas le supprimer (puisque je suppose qu'il a été fait avant que Jason Iverson ne supprime effectivement le tableau) ?

3 votes

@gsamaras : Je suis d'accord que c'est confus mais c'est toujours correct : votre code ne devrait pas avoir de suppression manuelle que vous devez vous rappeler de ne pas oublier. C'est-à-dire utilisé les pointeurs intelligents et autres conteneurs.

9 votes

@GManNickG Je pense que votre commentaire pourrait être moins dogmatique. Le code est correct, même s'il n'est pas idéal. Les pointeurs intelligents et les conteneurs sont presque toujours une meilleure option (surtout dans une question de débutant comme celle-ci) mais pas "toujours" toujours.

82voto

Ben Voigt Points 151460

Depuis C++11, il existe une alternative sûre à new[] et delete[] qui n'entraîne pas de frais généraux, contrairement à std::vector :

std::unique_ptr<int[]> array(new int[size]);

En C++14 :

auto array = std::make_unique<int[]>(size);

Les deux exemples ci-dessus reposent sur le même fichier d'en-tête, #include <memory>

7 votes

Je ne sais pas si c'est juste moi, mais la syntaxe C++11 a l'air horrible. Le C++14 a l'air bien meilleur. Mais là encore, je n'ai pas suivi l'évolution depuis le pré-C++11. Se souvenir de toutes ces nouvelles expressions est difficile.

36voto

jveazey Points 2490

Vous pourriez envisager d'utiliser la bibliothèque de modèles standard. Elle est simple et facile à utiliser, et vous n'avez pas à vous soucier des allocations de mémoire.

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

int size = 5;                    // declare the size of the vector
vector<int> myvector(size, 0);   // create a vector to hold "size" int's
                                 // all initialized to zero
myvector[0] = 1234;              // assign values like a c++ array

9 votes

@Ed, la restriction dans la question semble plutôt arbitraire. std::vector avec le constructeur approprié fonctionne très bien et devrait être signalé comme une alternative. Parfois, les gens posent mal la question, et ceci pourrait compter parmi ces cas - c'est très bref et ne donne aucune justification pour préférer new .

4 votes

@Ed : Il n'y a aucune raison d'utiliser new[] au lieu de std::vector .

0 votes

Gman Sur les appareils Windows ce STL est énorme Vous prenez un gros coup pour l'utiliser. En fait, cela serait vrai pour plusieurs appareils embarqués, où un meg supplémentaire sur votre application signifie que votre utilisateur a des heures d'utilisation en moins entre les vidages de données.

11voto

Ed S. Points 70246
int* array = new int[size];

4 votes

Cela répond simplement à la question.

0 votes

@GManNickG Parce que le vecteur peut être plus pratique ou pour d'autres raisons ? Parce que je rencontre souvent des fonctions tierces qui nécessitent l'utilisation de tableaux au lieu de vecteurs.

5 votes

@Lèsemajesté Ce n'est pas une raison pour ne pas utiliser les vecteurs - Le std::vector::data() La fonction membre renverra le tableau brut sous-jacent si nécessaire.

4voto

carimus Points 133

Dès lors que la question porte sur les tableaux dynamiques, il se peut que vous souhaitiez non seulement créer des tableaux de taille variable, mais aussi modifier leur taille pendant l'exécution. Voici un exemple avec memcpy vous pouvez utiliser memcpy_s ou std::copy également. Selon le compilateur, <memory.h> ou <string.h> peut être nécessaire. Lorsque vous utilisez cette fonction, vous devez allouer une nouvelle région de mémoire, y copier les valeurs des régions de mémoire originales, puis les libérer.

//    create desired array dynamically
size_t length;
length = 100; //for example
int *array = new int[length];

//   now let's change is's size - e.g. add 50 new elements
size_t added = 50;
int *added_array = new int[added];

/*   
somehow set values to given arrays
*/ 

//    add elements to array
int* temp = new int[length + added];
memcpy(temp, array, length * sizeof(int));
memcpy(temp + length, added_array, added * sizeof(int));
delete[] array;
array = temp;

Vous pouvez utiliser la constante 4 au lieu de sizeof(int) .

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