Initialisation de la matrice sur le tas
Comment puis-je lancer manuellement les valeurs dans le tableau sur le tas?
Si le tableau est variable locale (dans la pile), il peut être fait très élégant et facile, comme ceci:
int myArray[3] = {1,2,3};
Malheureusement, d'après le code
int * myArray = new int[3];
myArray = {1,2,3};
génère une erreur de compilation
error: expected primary-expression before ‘{’ token
error: expected `;' before ‘{’ token
Dois-je utiliser le cycle, ou pas-si-bien-de manière élégante, comme c'?
myArray[0] = 1;
myArray[1] = 2;
myArray[2] = 3;
de la porte de votre exemple, vous voulez remplir les éléments du tableau 0 .. N, 1 .. N + 1. Une boucle for feraient très bien l'affaire. Quelle est votre intention?
OriginalL'auteur Radek Simko | 2010-12-31
Vous devez vous connecter pour publier un commentaire.
Ce qui est intéressant: Poussant un tableau dans un vecteur
Toutefois, si cela n'est pas fait pour vous, essayez les opérations suivantes:
std::copy(stack_array, stack_array+5, &array[0]);
VLA (variable length array) n'est pas une partie de C++ standard
VLAs en C++ donc -1
OriginalL'auteur langerra.com
Vous pouvez définir la constante de tableau, comme myConstArray[] = {1, 2, 3} et ne memcpy après new int[3].
Malheureusement, c'est inefficace, au mieux, et de l'impossible, au pire (si le type est une classe sans copier/affectation).
Avec le type qui est une classe sans copier/affectation, il serait impossible d'utiliser la constante de tableau.
Mais si ce sont de pointeur d'un objet à lui-même?
OriginalL'auteur Nickolay Olshevsky
{1,2,3}
est très limité, de la syntaxe, spécifique au stade de la structure d'initialisation (apparemment C-gamme de style a été considéré comme l'un de trop). La seule chose que vous pouvez faire, c'est commeint x[] = {1,2,3};
ouint x[3] = {1,2,3};
, mais vous ne pouvez pas le faire niint x[3]; x={1,2,3};
ni utiliser{1,2,3}
dans tout autre lieu.Si tu fais du C++, il est préférable d'utiliser quelque chose comme std::vector au lieu de C-style des tableaux, comme ils sont considérés comme dangereux par exemple, vous ne pouvez pas savoir leur taille et devez les supprimer avec un
delete[]
, pas normaledelete
. Avec std::vector, vous aurez toujours le même problème d'initialisation. Si j'ai utilisé une telle initialisation beaucoup, je serait probablement créer une macro de l'attribution d'une dummy variable locale et de la copie de la mémoire de destination.EDIT: Vous pouvez aussi faire comme ceci (std::vector toujours préférable):
mais vous aurez à remplacer la fonction avec un nombre variable d'arguments, ou de l'utilisation va_arg qui est, encore une fois, dangereux.
EDIT2: Ma réponse n'est valable que pour le C++03, que les autres personnes mentionnées au C++0x a quelques améliorations à ce.
OriginalL'auteur Roman L
C++0x standard a le type spécial appelé
initializer_list
et la syntaxe particulière (type d'expression{1, 2, 3}
eststd::initializer_list<int>
).std::vector
etstd::array
ont les constructeurs, donc vous pouvez écrirevector<int> v = {1, 2, 3}
.Il n'y a pas de bonne solution en C++98/C++03.
OriginalL'auteur crazylammer
Si vous voulez une réponse générale qui fonctionne pour tous types de, ce que vous faites est:
malloc() ou l'opérateur new() pour créer un tableau de non initialisée de stockage de la bonne longueur, calculé par nelts * sizeof(T)
Faire un tableau constitué de l'argument pour un constructeur pour chaque élément.
Appliquer le constructeur de placement de la forme de chaque élément à l'aide de l'argument correspondant.
Cela ne fonctionne que si le même constructeur va faire pour chaque élément. Si non, vous aurez besoin d'un plus compliqué structure de données et un algorithme pour choisir le bon constructeur pour chaque élément.
Un cas particulier est d'utiliser un tableau des éléments réels et d'utiliser le constructeur de copie et un cas spécial, c'est que, quand le type est un POD et vous pouvez simplement utiliser memcpy pour construire le beaucoup à la fois.
Si le constructeur prend deux arguments, vous aurez besoin d'écrire un initiateur de la procédure (wrapper). Par exemple:
et l'utiliser à la place de tout nouveau(p).
OriginalL'auteur Yttrill