std::gslice_array
出自cppreference.com
| 在標頭 <valarray> 定義
|
||
| |
||
std::gslice_array 是接受 std::gslice 實參的 valarray 下標運算符所用的輔助模板。它擁有到 std::gslice 對象所指定的數組子集的引用語義。
成員類型
| 類型 | 定義 |
value_type
|
T
|
成員函數
構造一個 gslice_array (公開成員函數) | |
銷毀一個 gslice_array (公開成員函數) | |
| 賦值內容 (公開成員函數) | |
| 在通用切片所指代的數組上進行算術運算。 (公開成員函數) |
示例
運行此代碼
#include <cassert>
#include <cstddef>
#include <iomanip>
#include <iostream>
#include <numeric>
#include <valarray>
int main()
{
std::valarray<int> data(32);
std::iota(std::begin(data), std::end(data), 0);
const std::size_t offset = 1, z = 2, y = 3, x = 4;
const std::valarray<std::size_t> sizes{z, y, x};
const std::valarray<std::size_t> strides{15, 5, 1};
const std::gslice gslice = std::gslice(offset, sizes, strides);
// 根据公式生成索引:
// index[k] = offset + [0,1,2)*15 + [0,1,2,3)*5 + [0,1,2,3,4)*1
// = offset + inner_product(sizes[k], strides);
// 其中 sizes[k] = {[0,z), [0,y), [0,x)},最右侧索引 (x) 变化最快。
// 结果是一下索引集合:
// index[0] = 1 + 0*15 + 0*5 + 0*1 = 1
// index[1] = 1 + 0*15 + 0*5 + 1*1 = 2
// index[2] = 1 + 0*15 + 0*5 + 2*1 = 3
// index[3] = 1 + 0*15 + 0*5 + 3*1 = 4
// index[4] = 1 + 0*15 + 1*5 + 0*1 = 6
// index[5] = 1 + 0*15 + 1*5 + 1*1 = 7
// index[6] = 1 + 0*15 + 1*5 + 2*1 = 8
// index[7] = 1 + 0*15 + 1*5 + 3*1 = 9
// ...
// index[22] = 1 + 1*15 + 2*5 + 2*1 = 28
// index[23] = 1 + 1*15 + 2*5 + 3*1 = 29
const std::valarray<int> indices = data[gslice];
for (unsigned i = 0; i != indices.size(); ++i)
std::cout << std::setfill('0') << std::setw(2) << indices[i] << ' ';
std::cout << "\n索引总数: " << indices.size() << '\n';
assert(indices.size() == x * y * z);
data = 0;
std::gslice_array<int> gslice_array = data[gslice];
gslice_array = 1;
// 对应于生成的索引的单元格 = '1', 跳过的单元格 = '0'.
for (auto i : data)
std::cout << i << ' ';
std::cout << "\n1 的求和 = " << data.sum() << '\n';
}
輸出:
01 02 03 04 06 07 08 09 11 12 13 14 16 17 18 19 21 22 23 24 26 27 28 29
索引总数: 24
0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 0
1 的求和 = 24
參閱
到 valarray 應用切片後的子集的代理 (類模板) | |
(C++23) |
多維非擁有數組視圖 (類模板) |