假设我们有一张桌子:
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
(此处为21)中,我们会在1到N之间获得一些table
个数字。
在表格中找到与元素#nThPos
或其坐标([row] [col])对应的元素的最有效方法是什么?
对于这种特殊情况,表格被平整的方向无关紧要:如果nThPos == 8
,结果可能是71(即[1] [0])或91(即[1] [ 2])。
Be ware:我的问题与this one非常相似。但我的情况是内部向量有不同的长度。
答案 0 :(得分:3)
如果你不选择维护一些边数据(或选择一个完全不同的基本表示),那么没有比显而易见的方法更有效的方法(迭代通过外部向量累积内部向量的总大小,直到你达到正确的内部向量)。
如果效率很重要,请以不同方式存储数据。
答案 1 :(得分:0)
这是一个天真的实现,似乎只是简单的工作:
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
开始,因此7
表示有关OP问题的nThPos = 8
。
如果您需要其他答案和评论所述的表现,我不会推荐它。