2015-04-05 51 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)] 
}