如何到达向量矢量的第N个元素,其中内部向量可能具有不同的长度?

时间:2015-08-25 14:32:17

标签: c++ vector multidimensional-array

假设我们有一张桌子: 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非常相似。但我的情况是内部向量有不同的长度。

2 个答案:

答案 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

如果您需要其他答案和评论所述的表现,我不会推荐它。