2013-11-27 162 views
0

有没有办法从二维数组获取一维数组的索引?从二维数组获取一维数组索引

例如:我有一个2D数组,数组大小是未知的,并且在需要时将(使用std :: vector)更改为push_back。这工作得很好,只要它是一个二维数组,但我需要得到这个二维数组的一维数组索引。

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作为我的答案。到目前为止,我尝试了几件事情,但没有成功。有什么建议么?

+0

一切都是先前组的大小之和加上中您是否尝试过的事情当前组中的索引? –

+0

如果您使用的是C++,请不要使用原始数组来存储matrcies。使用ADT矩阵类型(如线性代数库提供的类型)并调用它们的.data()成员函数。 – 111111

回答

2

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

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

+0

技术上偏移量是std :: vector的.size()参数不是每个组的? – Neophile

+1

@TheNewbie是,每个组的累计.size()参数。 (因为抵消将是一个数组) – yasen

+0

你的答案看起来很有前途,但我仍然试图获得抵消。有关我如何获得该建议的任何建议? .size()只是给我组的当前大小。 – Neophile

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