valarray 標頭檔案中定義了 gslice 類,這是切片思想的泛化。gslice 物件從起始索引生成索引值,就像一個切片,但它能生成兩個或兩個以上的切片,具體實現方式有一點複雜。通常,gslice 會假定從表示多維陣列的 valarray 物件中選擇的元素會被用來作為元素的線性序列。
gslice 由 3 個引數值定義。第一個建構函式引數是起始索引,它是指定第一個分片的第一個元素的 size_t 型別的值,這和 slice 一樣。第二個引數是一個 valarray<size_t> 物件,它的每個元素都指定了 size。對於第二個引數指定的每一個 size,都有一個相應的步進;這些步進由第三個引數定義,它是一個和第二個引數有相同元素個數的象。第二個引數中,每個size的步進都在第三個引數中有相應的元素。
當然,gslice 表示的每個 slice 都有一個起始索引、大小和步進。第一個 slice 的起始索引是 gslice 建構函式的第一個引數。第一個 slice 的 size 是 valarray (由 size 組成)的第一個元素,步進是另一個的 valarray (由 stride 組成)的第一個元素。這應該可以很容易發現,但現在它變得有些複雜。
第一個 slice 生成的索引值是第二個 slice 的起始索引。也就是說,第二個 slice 從來自於第一個 slice 的每個索引中定義了一套索引值。整個過程以此類推。
第一個 slice 之後的每一個 slice 的索引都是由前一個 slice 生成的,它們會產生一組索引值。例如,如果 glice 的第一個 slice 的大小是 3,它定義了 3 個索引值;如果第二個 slice 的大小是 2,它生成了 2 個索引值。第二個 slice 的大小和步進會被使用 3 次,且每一次都會用第一個 slice 的索引值作為起始索引。因此可以從這兩個 slice 中得到 6 個索引值,它會從 valarray 中選擇 6 個元素。
用 gslice 作為 valarray 的下標的結果是會包含一個給定元素的多個參照。當 gslice 的最後一個 slice 所生成的索引序列重疊時,會出現這種情況。圖 1 展示了一個 gslice 從 valarray 中選擇元素的簡單範例。
圖 1 gslice 物件如何從 valarray 中選擇元素(點此檢視高清大圖)