有没有办法从2D数组中获取一维数组的数组索引?
对于Eg:我有一个2D数组,数组大小未知,并且在需要时更改(我已经使用std :: vector)push_back。只要它是一个2D数组,这个工作正常,但我需要获得这个2D数组的1D数组索引。
2D array:
Group 1 - 1, 2, 3
Group 2 - 4, 5, 6
Group 3 - 7, 8, 9, 10, 11, 12
等等。
因此,基本上有一种快速的方法可以知道当从组2中选择6时,即数组[1] [2] = 6 =>我需要数组索引为:1D array =>数组[5] = 6 =>即我需要5作为我的答案。到目前为止,我尝试了几件但没有运气。有什么建议吗?
答案 0 :(得分:2)
如果您的数据是静态的,您可以创建另一个数组,在该数组中存储每个1D数组的偏移量。对于您的示例,您将拥有以下数组offset = {0, 3, 6}
。然后,您可以按offset[row] + col
找到索引。
如果您可以更改行大小,则可以将每行的大小存储在二进制索引树中,并使用单个查询在O(log n)中查找偏移量,其中n是行数(1D向量) )。但是,每次更改行大小时,都必须在O(log n)中再次更新结构。
答案 1 :(得分:0)
如果要创建向量向量(或向量列表),则不保证内存位置相关。因此,为了使其行为像一维数组,您需要将容器包装在您自己的类中并重载operator[]
。然后,该运算符需要检查索引以确定要返回的正确向量元素。简化版可能如下所示:
T& operator[](std::size_t index)
{
std::size_t temp = index;
if (index < myVectors[0].size())
{
return myVectors[0][index];
}
temp = index - myVectors[0].size()
if (temp < myVectors[1].size())
{
return myVectors[1][temp];
}
// etc ...
}
您可以将其简化为循环:
T& operator[](std::size_t index)
{
std::size_t temp = index;
for (std::size_t i = 0; i < myVectors.size(); ++i)
{
if (temp < myVectors[i].size())
{
return myVectors[i][temp];
}
temp -= myVectors[i].size();
}
throw std::out_of_range("Array access out of bounds!");
}