带自定义索引的数组

时间:2015-04-05 19:28:31

标签: c++ arrays

所以我想创建一个包含九个元素的数组,但是我希望我可以指定索引,也就是说,而不是访问我的数组元素,

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;

它将用于简单地使用mymatrix[x][y]来检查某些位置(说位置x,y)。我也知道有些元素永远不会被检查,所以它们并不是真正需要的。为了节省尽可能多的内存,我们的想法是摆脱那些不需要的元素,但仍然保留结构来检查我的元素。

2 个答案:

答案 0 :(得分:6)

这样的数组最好用标准C ++库提供的一个关联容器表示 - 即std::map<int,bool>std::unordered_map<int,bool>。这些容器提供了一种在C ++中执行此操作的惯用方法。

使用关联容器的另一个好处是能够迭代值以及它们的外部索引&#34;。

如果你坚持使用数组存储值,你必须创建自己的类来构建一个&#34;映射&#34;外部和内部索引之间。这将占用大量内存用于O(1)访问时间,使用CPU周期进行二进制搜索以及索引到索引映射,使用线性搜索或硬编码外部索引。

答案 1 :(得分: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)]
}