设置指向任意维度数组的指针
Setting pointer to arbitrary dimension array?
当我想启动一个多维数组时,我通常只使用指针。例如,对于两个维度,我使用:
double **array
对于三个我使用:
double ***array
但是,我想根据指示维度的命令行参数设置一个多维数组。一旦您有一个具有所需维度数的变量,有没有办法设置任意大小的数组?
即使这整个问题表明存在设计缺陷,您也可以(某种程度上)完成此操作:
template<typename T>
class MultiArray
{
public:
MultiArray(std::size_t dimen, std::size_t dimen_size) : _dimensions(dimen)
{
_data = new T[dimen * dimen_size];
}
// implment copy constructor, copy-assignment operator, destructor, and move constructors as well
T* operator[](int i)
{
assert(0 <= i && i < _dimensions); // bounds check for your dimension
return &_data[i];
}
private:
T* _data;
std::size_t _dimensions;
};
int main()
{
MultiArray<int> a(5, 2);
a[4][1] = 3;
std::cout << a[4][1] << std::endl;
return 0;
}
如果你想要锯齿状,你必须对每个"维度"的边界进行更多的数学和维护。
您遇到的问题使尺寸对您的应用程序有意义。 通常,多维数组表示某些东西(例如,2D向量可以表示笛卡尔空间,3D或4D向量可用于操作3D图形的数据)。 在第 4 维之外,为数组找到有效的含义变得模糊不清,并且随着每个新维度的出现,维护其背后的逻辑变得越来越复杂。
您可能
对以下代码感兴趣,它允许您使用任何"动态"维度:
#include <cassert>
#include <cstddef>
#include <vector>
template<typename T>
class MultiArray
{
public:
explicit MultiArray(const std::vector<size_t>& dimensions) :
dimensions(dimensions),
values(computeTotalSize(dimensions))
{
assert(!dimensions.empty());
assert(!values.empty());
}
const T& get(const std::vector<size_t>& indexes) const
{
return values[computeIndex(indexes)];
}
T& get(const std::vector<size_t>& indexes)
{
return values[computeIndex(indexes)];
}
size_t computeIndex(const std::vector<size_t>& indexes) const
{
assert(indexes.size() == dimensions.size());
size_t index = 0;
size_t mul = 1;
for (size_t i = 0; i != dimensions.size(); ++i) {
assert(indexes[i] < dimensions[i]);
index += indexes[i] * mul;
mul *= dimensions[i];
}
assert(index < values.size());
return index;
}
std::vector<size_t> computeIndexes(size_t index) const
{
assert(index < values.size());
std::vector<size_t> res(dimensions.size());
size_t mul = values.size();
for (size_t i = dimensions.size(); i != 0; --i) {
mul /= dimensions[i - 1];
res[i - 1] = index / mul;
assert(res[i - 1] < dimensions[i - 1]);
index -= res[i - 1] * mul;
}
return res;
}
private:
size_t computeTotalSize(const std::vector<size_t>& dimensions) const
{
size_t totalSize = 1;
for (auto i : dimensions) {
totalSize *= i;
}
return totalSize;
}
private:
std::vector<size_t> dimensions;
std::vector<T> values;
};
int main()
{
MultiArray<int> m({3, 2, 4});
m.get({0, 0, 3}) = 42;
m.get({2, 1, 3}) = 42;
for (size_t i = 0; i != 24; ++i) {
assert(m.computeIndex(m.computeIndexes(i)) == i);
}
return 0;
}
相关文章:
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”