web-dev-qa-db-fra.com

Manière correcte de travailler avec le vecteur de tableaux

Quelqu'un pourrait-il dire quelle est la bonne façon de travailler avec un vecteur de tableaux?

J'ai déclaré un vecteur de tableaux (vector<float[4]>) mais a obtenu error: conversion from 'int' to non-scalar type 'float [4]' requested en essayant de resize le. Qu'est-ce qui ne va pas?

55
Pulkit Sinha

Vous ne pouvez pas stocker de tableaux dans un vector ni dans aucun autre conteneur. Le type des éléments à stocker dans un conteneur (appelé le type de valeur du conteneur ) doit être à la fois conforme à la copie et assignable. Les tableaux ne sont ni l'un ni l'autre.

Vous pouvez cependant utiliser un modèle de classe array, comme celui fourni par Boost, TR1 et C++ 0x:

std::vector<std::array<double, 4> >

(Vous voudrez remplacer std::array avec std::tr1::array pour utiliser le modèle inclus dans C++ TR1 ou boost::array à utiliser le modèle des bibliothèques Boost . Alternativement, vous pouvez écrire le vôtre; c'est assez simple.)

114
James McNellis

Utilisation:

vector<vector<float>> vecArray; //both dimensions are open!
8
Nawaz

Il n'y a pas d'erreur dans le code suivant:

float arr[4];
arr[0] = 6.28;
arr[1] = 2.50;
arr[2] = 9.73;
arr[3] = 4.364;
std::vector<float*> vec = std::vector<float*>();
vec.Push_back(arr);
float* ptr = vec.front();
for (int i = 0; i < 3; i++)
    printf("%g\n", ptr[i]);

OUTPUT IS:

6,28

2,5

9,73

4.364

EN CONCLUSION:

std::vector<double*>

est une autre possibilité en dehors de

std::vector<std::array<double, 4>>

que James McNellis a suggéré.

8
user2133061

Chaque élément de votre vecteur est un float[4], donc lorsque vous redimensionnez, chaque élément doit être initialisé par défaut à partir d’un float[4]. Je suppose que vous avez essayé d’initialiser avec une valeur de int comme 0?

Essayer:

static float zeros[4] = {0.0, 0.0, 0.0, 0.0};
myvector.resize(newsize, zeros);
5
Mark Ransom