如何得到一个向量的向量的第n个元素其中的内部向量可能有不同的长度

How to get to the Nth element of a vector of vectors where inner vectors might have different lengths?

本文关键字:向量 内部 元素 可能有 何得 一个      更新时间:2023-10-16

假设我们有一个表: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

如果你像其他回答和评论中说的那样需要性能,我不推荐它。