2011-11-11 4 views
1

On nous donne un certain nombre int el_position qui est une position de l'élément voulu par nous dans la représentation aplatie de notre vecteur 2d (std::vector< std::vector<int> > matrix(5, std::vector<int>(4))).Comment accéder au Nième élément d'un 2d std :: vector (`std :: vector <std :: vector <T>>`)?

Signification si nous avions cette matrice

11 21 31 41 51 
61 71 81 91 101 

et on nous a donné el_position==7 nous aurions besoin pour obtenir deuxième élément de deuxième rangée. Est-il possible de faire une telle chose avec le vecteur std 2d? Comment obtenir la valeur d'un élément en lui donnant sa position dans un tableau aplati?

Répondre

3

Bien sûr cela est possible:

row = el_position % row_length; 
col = el_position/row_length; 
3
size_t size_y = matrix.front().size(); // to get your Y dimension 
return matrix[el_position/size_y][el_position % size_y]; 
+0

Mais, comme je l'ai noté dans ma réponse, faites attention à 'matrix.front(). Size()' pour obtenir la valeur dont vous avez besoin. –

+0

@ MichaelKrelin-hacker: d'accord, et pour éviter tout problème, je recommande d'utiliser 'boost :: array' ou' std :: array' dans le cas de C++ 11 ('std :: vector > ') –

+0

' std :: vector 'peut-être est-il plus complet? –

2

Vous prenez juste un indice de n/W et l'autre - n%W, où W est la largeur (ou longueur de ligne, peu importe). Notez qu'en fait, dans le vecteur des vecteurs, vous pouvez avoir des vecteurs de longueur différente, c'est donc à vous de casser les choses.

1
// Assuming fixed dimensions: 
matrix[el_position/size][el_position%size]; 

/ est division entière, donc calcule le nombre de lignes complètes que nous devons passer pour trouver la ligne que nous recherchons et % est le reste de la division entière, trouve donc jusqu'où nous devrions compenser dans la ligne.

Si l'un de vos vecteurs internes n'a pas la même taille, cela échouera. Vous pouvez vérifier cette hypothèse avec deux assertions:

assert(matrix.size()); // needed for the front element to be valid 
assert(std::count(matrix.begin(), matrix.end(), matrix.front().size()) 
     == matrix.size()); // the count will be the number of elements 
          // if it's correct 
Questions connexes