web-dev-qa-db-fra.com

tableau de vecteurs ou vecteur de tableaux?

Je suis nouveau dans C++ STL et j'ai du mal à comprendre la représentation graphique.

vector<int> adj[N];

Cela crée-t-il donc un tableau de types vectoriels ou un vecteur de tableaux? Le code BFS semble parcourir une liste de valeurs présentes à chaque instance de adj [i], et semble donc fonctionner comme un tableau de vecteurs. La syntaxe pour créer un vecteur est la suivante:

vector<int> F;

ce qui créerait effectivement un vecteur à une seule dimension F.

Quelle est la différence entre

vector< vector<int> > N; 

et

vector<int> F[N]
36
thematroids

C’est ce qui se passe (vector<int> adj[N];) créer un tableau de type vector ou crée-t-il un vecteur de tableaux?

Il crée un tableau de vecteurs

Quelle est la différence entre

vector< vector<int> > N; 

et

vector<int> F[N]

Dans le premier cas, vous créez un tableau dynamique de tableaux dynamiques (vecteur de vecteurs). La taille de chaque vecteur peut être modifiée au moment de l'exécution et tous les objets seront alloués sur le tas.

Dans le second cas, vous créez un tableau de vecteurs de taille fixe. Vous devez définir N au moment de la compilation, et tous les vecteurs seront placés sur la pileCependant, chaque vecteur allouera des éléments sur le tas.

Je préférerais toujours le cas de vecteur de vecteurs (ou la matrice, si vous pouviez utiliser des bibliothèques tierces), ou std::array de std::arrays en cas de tailles de compilation.

Je suis nouveau dans C++ STL et j'ai du mal à comprendre la représentation graphique.

Vous pouvez aussi représenter un graphique sous forme de std::unordered_map<vertex_type,std::unordered_set<vertex_type>>, où vertex_type est le type de sommet (int dans votre cas). Cette approche pourrait être utilisée afin de réduire l'utilisation de la mémoire lorsque le nombre de bords n'est pas énorme.


: Pour être précis - pas toujours sur pile - cela peut faire partie d'un objet complexe sur le tas. De plus, la norme C++ ne définit aucune exigence pour la pile ou le tas, elle fournit uniquement des exigences pour la durée de stockage, telles que automatique, statique, thread ou dynamique.

41
awesoon

Réponse courte:
C'est un tableau de vector <int> S.

Réponse longue:
Lors de la lecture d'une déclaration telle que

vector<int> adj[N];

Le compilateur utilise une méthode connue sous le nom de "spirale -" ou "clockwise-rule" afin d'interpréter ce que cela signifie. L'idée derrière la règle de la spirale est que vous commencez par le nom de la variable et que vous vous dirigez vers l'extérieur dans une spirale dans le sens des aiguilles d'une montre afin de déterminer le type de variable dont il s'agit. Par exemple:

char* str [10];

Peut être interprété comme ceci:

        ____
       |    |
char* str [10];
  |_________|


Créer str un tableau de 10 char* S.

Par conséquent, vector<int> adj[N]; Est un tableau de vecteurs plutôt qu'un vecteur de tableaux



La pratique rend parfait:

1: Que signifie int * foo [ ];?

Répondre:

"foo" est un tableau de pointeurs sur des entiers


2: Que signifie int * (*foo [ ] )();?

Répondre:

"foo" est un tableau de pointeurs vers des fonctions renvoyant des pointeurs sur des entiers


3: Que signifie int * (*(*foo [ ] )())();?

Répondre:

"foo" est un tableau de pointeurs vers des fonctions renvoyant des pointeurs vers des fonctions renvoyant des pointeurs sur des entiers

14
Chef Cyanide
vector<int> arr[N];

Il affiche un tableau de vecteur, chaque tableau [i] aurait un vecteur stocké qui peut traverser de nombreuses valeurs. C'est comme un tableau de liste chaînée où les têtes ne sont stockées que dans des positions de tableau [i].


vector<vector<int> > N vs vector<int> F[N]

La différence entre un vecteur 2D et un tableau de vecteurs réside dans le fait que la taille des vecteurs 2D peut être étendue, tandis que la dimension d'un tableau de vecteurs est fixée à la taille du tableau.

8
Martin Gardener

Sous le capot, un vecteur utilise toujours un tableau, il est spécifique à la mise en œuvre, mais il est prudent de penser que:

vector<int>

crée en interne un int []. Ce que vous donne les vecteurs, c’est qu’il détourne de vous la partie où, si vous souhaitez redimensionner, vous n’avez pas à redistribuer manuellement, etc., il le fait pour vous (et bien plus encore, bien sûr). Quand vous faites: vector<vector<int>> vous allez créer un vecteur de vecteurs, ce qui signifie une matrice 2D. Vous pouvez l'imbriquer autant que vous le souhaitez. Vector prend un type T et alloue un tableau de ce type. donc si vous passez le vecteur en tant que type T, il fera effectivement ce que vous avez fait dans votre première ligne, un tableau de vector<int>. J'espère que c'est logique

5
Marco Giordano