2011-11-11 180 views
1

我们给出了一些int el_position号码,这是我们想要的一个位置,通过我们的二维矢量(std::vector< std::vector<int> > matrix(5, std::vector<int>(4)))的flatened表示。如何到达2d std :: vector的第N个元素(`std :: vector <std :: vector <T>>`)?

含义,如果我们有这样的矩阵

11 21 31 41 51 
61 71 81 91 101 

,我们分别给予el_position==7,我们需要得到第二排的第二个元素。是否有可能用std 2d向量做这样的事情?如何通过给定在扁平数组中的位置来获取元素的值?

回答

3

相信这是可能的:

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

但是,正如我在我的回答中指出的那样,要注意'matrix.front()。size()'来产生你需要的值。 –

+0

@ MichaelKrelin-hacker:同意了,为了避免任何可能的麻烦,我建议在C++ 11('std :: vector >') –

+0

'std :: vector '也许是比较全面的? –

2

你只取n/W一个索引,而另一个 - n%W,其中W是宽度(或行长度,等等)。请注意,实际上,在矢量矢量中,您可能具有不同长度的矢量,所以它是由你来分解的。

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

/是整数除法,所以计算,我们必须通过找到行,我们正在寻找和%完整的行数是余从整数除法,所以我们应该找到多远,以抵消行。

如果你的一个内部矢量的大小不一样,这将失败。你可以用两个断言来检查这个假设:

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 
相关问题