Get linear index for multidimensional access(获取多维访问的线性索引)
本文介绍了获取多维访问的线性索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试实现一个多维std::数组,它保存一个大小为Dim-n-1*Dim-n-2*...*Dim-1的连续内存数组。为此,我使用来自std::数组:的私有继承constexpr std::size_t factorise(std::size_t value)
{
return value;
}
template<typename... Ts>
constexpr std::size_t factorise(std::size_t value, Ts... values)
{
return value * factorise(values...);
}
template<typename T, std::size_t... Dims>
class multi_array : std::array<T, factorise(Dims...)>
{
// using directive and some stuff here ...
template<typename... Indexes>
reference operator() (Indexes... indexes)
{
return base_type::operator[] (linearise(std::make_integer_sequence<Dims...>(), indexes...)); // Not legal, just to explain the need.
}
}
例如,multi_array<5, 2, 8, 12> arr; arr(2, 1, 4, 3) = 12;
将访问线性索引idx = 2*(5*2*8) + 1*(2*8) + 4*(8) + 3
。
我想我必须使用std::INTEGER_SEQUENCE,将一个整数序列传递给线性化函数和索引列表,但我不知道怎么做。我想要的是:
template<template... Dims, std::size_t... Indexes>
auto linearise(std::integer_sequence<int, Dims...> dims, Indexes... indexes)
{
return (index * multiply_but_last(dims)) + ...;
}
用MULTPLY_BUT_LAST乘以除最后一个维度之外的所有剩余维度(我了解如何使用诸如for factorise之类的常量变量模板函数实现,但我不知道是否可以使用std::INTEGER_SEQUENCE)。
我是各种模板操作和std::INTEGER_SEQUENCE方面的新手,我认为我遗漏了一些东西。是否有可能在没有开销的情况下获得线性索引计算(例如,如果操作是手写的)?
非常感谢您的帮助。
推荐答案
以下内容可能会有所帮助:
#include <array>
#include <cassert>
#include <iostream>
template <std::size_t, typename T> using alwaysT_t = T;
template<typename T, std::size_t ... Dims>
class MultiArray
{
public:
const T& operator() (alwaysT_t<Dims, std::size_t>... indexes) const
{
return values[computeIndex(indexes...)];
}
T& operator() (alwaysT_t<Dims, std::size_t>... indexes)
{
return values[computeIndex(indexes...)];
}
private:
size_t computeIndex(alwaysT_t<Dims, std::size_t>... indexes_args) const
{
constexpr std::size_t dimensions[] = {Dims...};
std::size_t indexes[] = {indexes_args...};
size_t index = 0;
size_t mul = 1;
for (size_t i = 0; i != sizeof...(Dims); ++i) {
assert(indexes[i] < dimensions[i]);
index += indexes[i] * mul;
mul *= dimensions[i];
}
assert(index < (Dims * ...));
return index;
}
private:
std::array<T, (Dims * ...)> values;
};
Demo
我将factorize
替换为折叠表达式(C++17)。
这篇关于获取多维访问的线性索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:获取多维访问的线性索引
基础教程推荐
猜你喜欢
- C++,'if' 表达式中的变量声明 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 运算符重载的基本规则和习语是什么? 2022-10-31