如何得到一个向量的向量的第n个元素其中的内部向量可能有不同的长度
How to get to the Nth element of a vector of vectors where inner vectors might have different lengths?
假设我们有一个表: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
。
如果你像其他回答和评论中说的那样需要性能,我不推荐它。
相关文章:
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何修改 lambda 内部字符串的向量
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何创建一个函数来提取向量内部字符串中的字段?
- 为什么我不能更改实例化对象内部的向量?
- 指针(指向指针)和新/malloc 向量(向量内部)c++
- std::vector::clear()ing 二维向量线程的内部向量安全吗?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 对内部有 2 对的向量进行排序
- C++:在循环内部或外部声明一个向量
- 输入内部 while 和向量
- STD ::向量如何调整其内部缓冲区大小
- 初始化向量的向量(外部向量和内部向量)
- 我的内部循环XML在C 向量中的预期无法正常使用Write_xml
- 向量C 内部的元素之和
- 在C++中,当两个向量类型不同时,如何将值存储到向量内部的向量中
- 如何推导函数内部向量的大小?(向量通过指向其第一个元素的指针传递)
- 无法从指针数组或向量内部访问指向对象的成员
- C++无法在创建静态向量后编辑该向量内部的向量项
- 如何在结构向量内部生成结构链接列表