2013-11-27 158 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!"); 
}