2015-04-05 50 views
3

所以我想創建九個元素的數組,但我想用我指定的指標,這是不是accesing我數組的元素,陣列定製指數

std::array<bool,9> myarray 

使用myarray[0], myarray[1], myarray[2]...我想要訪問它們,例如,

myarray[21], myarray[34], myarray[100], myarray[9], myarray[56]... 

但仍保留標準庫數組的屬性並僅存儲9個元素。

更具體地說,我需要輕鬆訪問布爾矩陣的元素。 也就是說,假設我有矩陣:

Array<array<bool,100>,100> mymatrix; 

並且它是將要用於檢查的某些位置(說的位置x,y)的容易簡單地使用mymatrix[x][y]。我也知道一些元素永遠不會被檢查,所以它們並不是真正需要的。爲了儘可能節省大部分記憶,這個想法是擺脫那些不需要的元素,但仍然保存結構來檢查我的元素。

+2

一般來說這聽起來是一個更好的數據結構爲您需求可能是地圖。你可以更具體的標準庫array_你想節省什麼_properties? – 2015-04-05 19:31:11

+0

基本上是內存成本和使用。主要帖子已更新。 – D1X 2015-04-05 19:57:36

+0

也訪問成本。 – D1X 2015-04-05 20:17:25

回答

6

這樣的數組最好用標準C++庫提供的關聯容器之一來表示 - 即std::map<int,bool>std::unordered_map<int,bool>。這些容器提供了一種在C++中實現這一點的慣用方式。

使用關聯容器的另一個好處是可以迭代值以及它們的外部「索引」。

如果你堅持使用數組來存儲值,你將不得不自己創建一個在外部和內部索引之間建立「映射」的類。這會爲O(1)訪問時間佔用大量內存,二進制搜索使用CPU週期加索引到索引映射,使用線性搜索或硬編碼外部索引。

+0

因此,如果我有變量'std :: unordered_map mymap'和'std :: array myarray','mymap.find(10)'的花費與'myarray [10]'相同嗎?我認爲它沒有。這就是爲什麼我想按照我的第一個問題中提到的那樣做。 – D1X 2015-04-05 20:16:21

+0

@ D1X雖然兩者具有相同的漸近複雜性,但數組查找速度要快很多。另一方面,數組需要更多的內存,所以這是經典的「速度記憶」折衷。有了100個元素和一個9元素的地圖,它可能會在內存方面有更多的速度,但值高達1,000,地圖會更小。 – dasblinkenlight 2015-04-05 20:33:04

+0

那麼,是不可能創建我所需要的並且仍然保存數組查找? – D1X 2015-04-05 20:44:23

1

乍一看,你想要的是一個std::map<int, bool>,它允許你有自己的指數。但是,地圖的大小並不固定。

爲了得到這兩個固定大小定製的指數,你可以結合地圖和一個自定義的數組添加和訪問功能:

map<int, bool> indices; // fill it with custom indices mapped onto the array 
array<bool, n> data; 

bool get(int index) { 
    return data[map(index)] 
}