如何在C++23 std::mdspan中查找元素并获取其二维索引?
二维std::mdspan的元素查找与索引映射方法
元素查找的思路
你可以直接遍历mdspan的二维维度定位目标元素;也可以调用data_handle()获取底层一维数组后,用常规一维数组查找方法得到元素的一维索引。
一维索引转二维索引的方法
std::mdspan没有提供直接的“一维转二维”快捷函数,但可以通过它的布局映射能力实现,以下分场景说明:
1. 适配任意布局的通用方法
利用mdspan的mapping()成员函数获取布局映射对象,该对象的unpack()方法可直接将一维索引转换为二维索引的tuple,无论默认行优先、列优先还是自定义布局都能适用:
#include <mdspan> #include <vector> #include <iostream> int main() { std::vector<int> data = {0,1,2,3,4,5,6,7,8,9,10,11}; std::mdspan<int, std::extents<size_t,3,4>> span(data.data()); size_t one_d_idx = 5; auto mapping = span.mapping(); auto [row, col] = mapping.unpack(one_d_idx); // 直接得到二维索引 std::cout << "一维索引" << one_d_idx << "对应二维索引(" << row << "," << col << ")\n"; std::cout << "元素值:" << span[row, col] << "\n"; return 0; }
2. 行优先布局(std::layout_right,默认)的手动计算
行优先布局下元素按行连续存储,转换逻辑为:
- 列数 = mdspan第二个维度的大小(
span.extent(1)) - 行索引 = 一维索引 / 列数
- 列索引 = 一维索引 % 列数
示例代码:
size_t cols = span.extent(1); size_t row = one_d_idx / cols; size_t col = one_d_idx % cols;
3. 列优先布局(std::layout_left)的手动计算
列优先布局下元素按列连续存储,转换逻辑相反:
- 行数 = mdspan第一个维度的大小(
span.extent(0)) - 列索引 = 一维索引 / 行数
- 行索引 = 一维索引 % 行数
示例代码:
size_t rows = span.extent(0); size_t col = one_d_idx / rows; size_t row = one_d_idx % rows;
内容的提问来源于stack exchange,提问作者Voivoid
相关产品推荐
相关产品推荐

