所以我想创建一个包含九个元素的数组,但是我希望我可以指定索引,也就是说,而不是访问我的数组元素,
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)。我也知道有些元素永远不会被检查,所以它们并不是真正需要的。为了节省尽可能多的内存,我们的想法是摆脱那些不需要的元素,但仍然保留结构来检查我的元素。
答案 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)]
}