gpt4 book ai didi

c++11 - 基于std::vector的N维张量

转载 作者:行者123 更新时间:2023-12-02 22:27:40 25 4
gpt4 key购买 nike

我想使用 std::vector 定义 n 维数据结构。我对operator()的定义有疑问。让我们看一下示例 2D 结构

class my_data {

public:
my_data (size_t N, size_t M) : tab(N*M), _N(N), _M(M) {}

const double& operator() (size_t i, size_t j) const {
return tab.at(i * M + j);
}

double& operator() (size_t i, size_t j) {
return tab.at(i * M + j);
}

private:
std::vector<double> tab;
size_t _N;
size_t _M;

};

我想使用模板为任何维度定义这样的结构,但我不知道是否可能。所以基本上我想要的就是这样的

my_data<4> vec (1,2,3,4);

定义大小为 1,2,3,4 的 4D“张量”(所有元素的数量为 1*2*3*4)。您现在可以通过键入

来访问和更改值
vec (0,0,0,0) = 2.0;

最佳答案

以下解决方案使用了一些 C++14 和 C++1z 功能,但它们可以轻松移植到 C++11:

#include <vector>
#include <utility>
#include <array>
#include <cstddef>

namespace detail
{
template <typename T, typename S>
class my_data;

template <typename T, std::size_t... Is>
class my_data<T, std::index_sequence<Is...>>
{
public:
my_data(decltype(Is)... size)
: t((size * ...)), s{{ size... }}
{}

T& operator()(decltype(Is)... i)
{
return t.at(index({{ i... }}));
}

const T& operator()(decltype(Is)... i) const
{
return t.at(index({{ i... }}));
}

private:
std::size_t index(const std::array<std::size_t, sizeof...(Is)>& a) const
{
std::size_t ind = a[0];
for (std::size_t i = 1; i < a.size(); ++i)
{
ind = ind * s[i] + a[i];
}
return ind;
}

std::vector<T> t;
const std::array<std::size_t, sizeof...(Is)> s;
};
}

template <typename T, std::size_t N>
using my_data = detail::my_data<T, std::make_index_sequence<N>>;

测试:

int main()
{
my_data<double, 4> vec(1,2,3,4);
vec(0,0,0,0) = 2.0;
}

DEMO

DEMO (C++11)

关于c++11 - 基于std::vector的N维张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33484671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com