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

Posted

技术标签:

【中文标题】如何到达内部向量可能具有不同长度的向量向量的第 N 个元素?【英文标题】:How to get to the Nth element of a vector of vectors where inner vectors might have different lengths? 【发布时间】:2015-08-25 14:32:17 【问题描述】:

假设我们有一张桌子: 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

我们得到了一个介于 1 和 N 之间的 int nThPos 数字,即 table 中的元素总数(此处为 21)。

在表格中查找与元素#nThPos 或其坐标 ([row][col]) 对应的元素的最有效方法是什么?

对于这种特殊情况,表格展平的方向无关紧要:如果nThPos == 8,结果可能是 71(即 [1][0])或 91(即 [1][2] )。

请注意:我的问题与this one 非常相似。但我的情况是内部向量有不同的长度。

【问题讨论】:

如果表是常量,那么您可以将表存储为vector,将表行存储为vector,其中每一行都将指向其在表中的开头 【参考方案1】:

如果您不选择维护一些辅助数据(或选择完全不同的基本表示),那么没有比显而易见的方法更有效的方法(迭代外部向量,累积内部向量的总大小,直到达到右内向量)。

如果效率很重要,请以不同的方式存储您的数据。

【讨论】:

我的问题是,大多数时候,我将使用表格来选择给定行中的元素,而不是整个表格中的任何元素。我想不出一种更有效的方式来存储我的数据以供两者使用。 当你写“side data”时,你到底是什么意思?将内部向量的长度存储在另一个向量中? 如果效率对不太常见的情况无关紧要,那就做显而易见的事情。如果效率对所有情况都很重要,那么有更复杂的方法来存储数据,这些方法在“整体”查找中获得主要效率,而在其他查找中损失很少。如果尺寸变化很少,那么其他表示对于任何查找都具有很高的效率,当尺寸变化时会丢失大量时间。您需要将效率视为所有可能操作的折衷方案。 @Prolix “散列”到正确的向量更快。该哈希表可以是另一个包含每个向量的起始偏移量的向量。 最明显(不一定是最好的)“辅助数据”将是所有早期内部向量的大小的总和,因此您可以二进制搜索而不是线性搜索。对于更便宜的查找来说,这对于大小更改来说是昂贵的。【参考方案2】:

这是一个简单的实现,似乎只是完成工作:

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 n0;
    std::generate(sizes.begin(),sizes.end(),[v,&n]  return v[n++].size(); ); // store the different dimensions
    size_t sumsizes[0], i1, ridx;
    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

如果您需要其他答案和 cmets 中所说的性能,我不会推荐它。

【讨论】:

以上是关于如何到达内部向量可能具有不同长度的向量向量的第 N 个元素?的主要内容,如果未能解决你的问题,请参考以下文章

C++ as in Java?: 具有 *variable* int 长度的向量向量

向量与子向量长度 n 的组合

(重新)将向量初始化为具有初始值的特定长度

matlab 定义数组问题?

C++:字符串向量的随机访问时间如何工作?

[UE4]用向量表示方向