You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:16:12