Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有自定义索引的数组_C++_Arrays - Fatal编程技术网

C++ 具有自定义索引的数组

C++ 具有自定义索引的数组,c++,arrays,C++,Arrays,所以我想创建一个包含九个元素的数组,但是我想让索引由我指定,也就是说,不要访问数组中的元素 std::array<bool,9> myarray 但仍然保留标准库数组的属性,只存储9个元素 更具体地说,我需要一个简单的访问布尔矩阵的元素。 也就是说,假设我有矩阵: Array<array<bool,100>,100> mymatrix; 数组mymatrix; 它将用于检查某些位置(比如位置x,y),只需使用mymatrix[x][y]。我也知道有些元素

所以我想创建一个包含九个元素的数组,但是我想让索引由我指定,也就是说,不要访问数组中的元素

std::array<bool,9> myarray
但仍然保留标准库数组的属性,只存储9个元素

更具体地说,我需要一个简单的访问布尔矩阵的元素。 也就是说,假设我有矩阵:

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

它将用于检查某些位置(比如位置x,y),只需使用
mymatrix[x][y]
。我也知道有些元素永远不会被检查,所以它们不是真正需要的。为了节省大部分内存,我们的想法是去掉那些不需要的元素,但仍然保存结构来检查我的元素。

< P>最好用标准C++库提供的一个关联容器来表示这样的数组——即<代码> STD::MAP<代码>或<代码> STD::unordeldmap MA/<代码>。这些容器提供了在C++中实现这一习惯的一种习惯用法。 使用关联容器的另一个好处是能够迭代值及其外部“索引”


如果坚持使用数组存储值,则必须创建自己的类,在外部索引和内部索引之间构建“映射”。这可能会占用大量内存,占用O(1)访问时间,使用CPU周期进行二进制搜索加上索引到索引映射,使用线性搜索,或者对外部索引进行硬编码。

乍一看,您需要的是一个
std::map
,它允许您拥有自己的索引。但是,地图的大小并不是固定不变的

为了获得固定大小和自定义索引,您可以将地图和数组与自定义添加和访问功能结合使用:

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)]
}
映射索引;//使用映射到数组的自定义索引填充它
阵列数据;
bool-get(整数索引){
返回数据[映射(索引)]
}

一般来说,map可能是一种更好的数据结构,可以满足您的需求。您能否更具体地说明您希望保留标准库阵列的哪些属性?基本上是内存成本和使用率。主帖子更新。那么,如果我有变量
std::unordered\u map mymap
std::array myarray
,那么
mymap.find(10)
的成本是否与
myarray[10]
相同?我以为没有。这就是我在第一个问题中提到的为什么要这样做。@D1X虽然两者具有相同的渐近复杂性,但数组查找速度要快得多。另一方面,数组占用更多内存,因此这是经典的“内存换速度”权衡。有了100个元素和一个9元素的映射,从内存的角度来说,这可能是一个清洗,速度会快得多,但如果值高达1000,映射会更小。那么,是否不可能创建我所需要的内容并仍然保留数组查找?@D1X Right-这要么是更多的CPU,要么是更多的内存。
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)]
}