假设我们有一个表:std::vector< std::vector<int> > table(3, std::vector<int>)
看起来像这样:
11 21 31 41 45 51 61
71 81 91 10 19 29
39 49 59 69 79 89 99 109
我们给定int nThPos
中1到N之间的某一个数,即table
中元素总数(这里是21)。
查找表中元素# nThPos
或其坐标([row][col])对应的元素的最有效方法是什么?
对于这个特殊的例子,表被平化的方向并不重要:如果是nThPos == 8
,结果可能是71(即[1][0])或91(即[1][2])。
如果你不选择维护一些侧数据(或者选择一个完全不同的基本表示),那么没有比明显的方法更有效的方法了(通过外部向量迭代累积内部向量的总大小,直到你到达正确的内部向量)。
这里有一个naïve实现,它似乎只做了这项工作:
std::array<size_t,2> give_coord(size_t idx, const std::vector<std::vector<int>>& v) {
std::vector<size_t> sizes(v.size());
size_t n{0};
std::generate(sizes.begin(),sizes.end(),[v,&n] { return v[n++].size(); }); // store the different dimensions
size_t sum{sizes[0]}, i{1}, r{idx};
while(idx >= sum) {
r -= sizes[i-1];
sum += sizes[i++];
}
return std::array<size_t,2>{{i-1,r}};
}
Live On Coliru
请注意,我认为索引从0
开始,因此关于OP问题,7
代表nThPos = 8
。
如果你像其他回答和评论中说的那样需要性能,我不推荐它。