您不能一般使用無符號整數,因爲某些維度上的基數很可能是負數。
因此,如果您編寫通用代碼,您最好從給出的數組中推斷出index
類型。
文件說
index
- 這是用於索引爲A.有符號整數類型它也可以用來表示步幅和索引基數。
一個 「正確」 基於索引的循環將類似於:
Live On Coliru
#include <boost/multi_array.hpp>
#include <iostream>
int main() {
using A = boost::multi_array<double, 3>;
A arr(boost::extents[3][2][4]);
std::iota(arr.data(), arr.data()+arr.num_elements(), 1.); // fill with increasing numbers
arr.reindex(-17);
for (A::index i = arr.index_bases()[0]; i < arr.index_bases()[0]+A::index(arr.shape()[0]); ++i) {
for (A::index j = arr.index_bases()[1]; j < arr.index_bases()[1]+A::index(arr.shape()[1]); ++j) {
for (A::index k = arr.index_bases()[2]; k < arr.index_bases()[2]+A::index(arr.shape()[2]); ++k) {
std::cout << "(" << i << "," << j << "," << k << "): " << arr[i][j][k] << "\n";
}
}
}
}
印刷
(-17,-17,-17): 1
(-17,-17,-16): 2
(-17,-17,-15): 3
(-17,-17,-14): 4
(-17,-16,-17): 5
(-17,-16,-16): 6
(-17,-16,-15): 7
(-17,-16,-14): 8
(-16,-17,-17): 9
(-16,-17,-16): 10
(-16,-17,-15): 11
(-16,-17,-14): 12
(-16,-16,-17): 13
(-16,-16,-16): 14
(-16,-16,-15): 15
(-16,-16,-14): 16
(-15,-17,-17): 17
(-15,-17,-16): 18
(-15,-17,-15): 19
(-15,-17,-14): 20
(-15,-16,-17): 21
(-15,-16,-16): 22
(-15,-16,-15): 23
(-15,-16,-14): 24
我明白爲什麼無符號是一個壞現在的想法b我仍然努力看到索引優於int的優點,是否更好地使用更明確的類型,如這樣? – oLas
@oLas是的,一般來說,使用抽象數據類型更好:它表達意圖,並使編寫便攜式代碼更容易。請記住,未來的平臺可能有不同的類型,您選擇的類型(例如'unsigned long')可能會不足。 [這就是說我會使用'ptrdiff_t',這是__完全_Bact今天使用的](http://www.boost.org/doc/libs/1_59_0/boost/multi_array/types.hpp)。但是'索引'看起來更漂亮 – sehe