2010-06-17 5 views
16

Existe-t-il un moyen d'initialiser un vecteur de vecteurs de la même manière, rapide, lorsque vous initialisez une matrice?Initialisation d'un vecteur de vecteurs?

typedef int type; 

type matrix[2][2]= 
{ 
{1,0},{0,1} 
}; 

vector<vector<type> > vectorMatrix; //??? 

Répondre

7

Pour le seul vecteur, vous pouvez utiliser ce qui suit:

typedef int type; 
type elements[] = {0,1,2,3,4,5,6,7,8,9}; 
vector<int> vec(elements, elements + sizeof(elements)/sizeof(type)); 

Sur la base que vous pouvez utiliser ce qui suit:

type matrix[2][2]= 
{ 
    {1,0},{0,1} 
}; 

vector<int> row_0_vec(matrix[0], matrix[0] + sizeof(matrix[0])/sizeof(type)); 

vector<int> row_1_vec(matrix[1], matrix[1] + sizeof(matrix[1])/sizeof(type)); 

vector<vector<type> > vectorMatrix; 
vectorMatrix.push_back(row_0_vec); 
vectorMatrix.push_back(row_1_vec); 

En c++0x, vous pouvez initialiser des conteneurs standard dans un de la même manière que les tableaux.

+0

Cette solution est la plus similaire à ce que j'avais en tête. – Eric

3

En C++ 0x, je pense que vous pouvez utiliser la même syntaxe que pour votre matrix.

En C++ 03, vous devez écrire du code fastidieux pour le remplir. Boost.Assign pourrait être en mesure de simplifier un peu, en utilisant quelque chose comme le code non testé suivant:

#include <boost/assign/std/vector.hpp> 

vector<vector<type> > v; 
v += list_of(1)(0), list_of(0)(1); 

ou même

vector<vector<type> > v = list_of(list_of(1)(0))(list_of(0)(1)); 
+0

J'ai essayé mais ça ne semble pas fonctionner. J'ai un 'vecteur ' et je voudrais initialiser le premier élément de la variable à un pour avoir un vecteur d'un seul vecteur d'élément initialisé à un. Merci d'avance. – saloua

+0

@tuxworker: En C++ 11, c'est 'vector > v {{1}};'. Avec Boost.Assign en C++ 03, quelque chose comme 'vector > v = list_of (list_of (1));'. Si cela ne fonctionne pas, posez une nouvelle question en indiquant ce que vous essayez et en décrivant ce qui ne va pas. –

+0

En effet, j'ai essayé 'vecteur > v (10); v + = list_of (list_of (1)); 'et' vector > v (10); v = list_of (list_of (1)); 'et j'ai une erreur de compilation. Je pense qu'il serait également préférable d'utiliser en plus répéter mais je ne sais pas comment. Je vais poser une nouvelle question. Je vous remercie – saloua

3
std::vector<std::vector<int>> vector_of_vectors; 

alors si vous voulez ajouter, vous pouvez utiliser cette procédure :

vector_of_vectors.resize(#rows); //just changed the number of rows in the vector 
vector_of_vectors[row#].push_back(someInt); //this adds a column 

Ou vous pouvez faire quelque chose comme ceci:

std::vector<int> myRow; 
myRow.push_back(someInt); 
vector_of_vectors.push_back(myRow); 

Ainsi, dans votre cas, vous devriez être en mesure de dire:

vector_of_vectors.resize(2); 
vector_of_vectors[0].resize(2); 
vector_of_vectors[1].resize(2); 
for(int i=0; i < 2; i++) 
for(int j=0; j < 2; j++) 
    vector_of_vectors[i][j] = yourInt; 
2

Si la matrice est complètement rempli -

vector< vector<int> > TwoDVec(ROWS, vector<int>(COLS)); 
//Returns a matrix of dimensions ROWS*COLS with all elements as 0 
//Initialize as - 
TwoDVec[0][0] = 0; 
TwoDVec[0][1] = 1; 
.. 
. 

Mise à jour: J'ai trouvé il y a une meilleure façon here

sinon s'il y a un nombre variable d'éléments dans chaque ligne (pas une matrice) -

vector< vector<int> > TwoDVec(ROWS); 
for(int i=0; i<ROWS; i++){ 
    while(there_are_elements_in_row[i]){   //pseudocode 
     TwoDVec[i].push_back(element); 
    } 
}