2015-10-20 108 views
1

在boost multi_array documentation的第一個示例中,聲明瞭一種用於索引的類型,即,爲什麼使用boost multi_array索引類型在C++中索引boost數組?

typedef boost::multi_array<double, 3> array_type; 
typedef array_type::index index; 

它然後可以用於循環數組索引,例如,

array_type someArray(boost::extents[3][3][3]); 
for(index i = 0; i < 3; i++) 
    someArray[0][0][i] = i; 

這可能是一個簡單的問題,但我不能找到它明確地證明文件,爲什麼要使用該指數,而不是說一個unsigned int

回答

2

您不能一般使用無符號整數,因爲某些維度上的基數很可能是負數。

因此,如果您編寫通用代碼,您最好從給出的數組中推斷出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 
+0

我明白爲什麼無符號是一個壞現在的想法b我仍然努力看到索引優於int的優點,是否更好地使用更明確的類型,如這樣? – oLas

+1

@oLas是的,一般來說,使用抽象數據類型更好:它表達意圖,並使編寫便攜式代碼更容易。請記住,未來的平臺可能有不同的類型,您選擇的類型(例如'unsigned long')可能會不足。 [這就是說我會使用'ptrdiff_t',這是__完全_Bact今天使用的](http://www.boost.org/doc/libs/1_59_0/boost/multi_array/types.hpp)。但是'索引'看起來更漂亮 – sehe