从2D数组中获取1D数组索引

Get 1D array index from a 2D array

本文关键字:数组 1D 索引 获取 2D      更新时间:2023-10-16

有没有办法从2D数组中获取1D数组的数组索引?

例如:我有一个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数组=>数组[5]=6=>即我需要5作为我的答案。我试了好几种方法,但到目前为止都没有成功。有什么建议吗?

如果您的数据是静态的,您可以制作另一个数组,在其中存储每个1D数组的偏移量。对于您的示例,您将拥有以下数组offset = {0, 3, 6}。然后你可以通过offset[row] + col找到索引。

如果可以更改行大小,则可以将每行的大小存储在二进制索引树中,并通过单个查询在O(logn)中找到偏移量,其中n是行数(1D向量)。但是,每次更改行大小时,都必须在O(logn)中再次更新结构。

如果您正在创建一个向量向量(或向量列表),则不能保证内存位置是相关的。因此,为了使它表现得像一个一维数组,您需要将容器包装在自己的类中并重载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!");
}