从2D阵列获取一维数组索引

时间:2013-11-27 15:48:43

标签: c++ arrays math 2d

有没有办法从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作为我的答案。到目前为止,我尝试了几件但没有运气。有什么建议吗?

2 个答案:

答案 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!");
}