C++中的非连续数组指针
Non-contiguous array pointers in C++
我正在为C++中的几个线性代数库编写包装代码,这些库可以以几种格式之一存储它们的数组,最常见的是密集列主、密集行主、压缩稀疏列和压缩稀疏行。我想创建一个数组包装器类,该类将以通用顺序访问这些数组的元素,同时保持基本库所需的底层内存顺序;也就是说,我希望能够使用基于行的索引以相同的方式访问包装的列主密集数组和包装的行主密集数组的元素。我无法在不干扰外部库功能的情况下对底层数组进行重新排序,并且鉴于我的数组的巨大大小,重新排序无论如何都会涉及大量的计算成本。这就是我的意思,假设"rowMajorArray"和"columnMajorArray"都按照其外部库的适当顺序存储类型"T"的值:
T * data;
// Initialize values of data
rowMajorArray R(data); // Stored row-major, with reordering of data if necessary
columnMajorArray C(data); // Stored column-major, with reordering of data if necessary
wrapperArray wrapperR(R); // DOES NOT reorder data
wrapperArray wrapperC(C); // DOES NOT reorder data
assert(wrapperR[3] == wrapperC[3]); // I want this to be true, i.e. transparent row indexing
assert(wrapperR[3][4] == wrapperC[3][4]); // I want this to be true, i.e. transparent element indexing
T * rowPointerR = wrapperR[0]; // Points to first row; should this be a reference: &(wrapperR[0]) ?
T * rowPointerC = wrapperC[0]; // Points to first row, even though stored column-major
assert( *(rowPointerR + 2) == *(rowPointerC + 2) ) // I want this to be true, i.e. transparent row pointers
T * elementPointerR = &(wrapperR[0][0]); // Points to individual element
T * elementPointerC = &(wrapperC[0][0]); // Points to individual element
assert( *(elementPointerR + 2) == *(elementPointerC + 2) ) // I want this to be true, i.e. transparent pointer arithmetic
从本质上讲,我的目标是让底层库能够使用与本机使用的相同的内存顺序访问包装的数组,同时使我的包装器代码能够透明地访问数据,而无需担心底层内存顺序。我不在乎我是否使用指针或索引语法,因为我可以做我需要的一切,只要我能正确访问行和元素;如果我只能直接实现指针,那么无论如何我都会重载索引运算符,以便与其他外部运算符重载库轻松集成。
提前感谢大家的帮助。
您只需要重载索引运算符,并在该运算符内部计算正确的偏移量。您的包装器需要知道它正在包装哪种数据结构。 它可以像在创建这些类型之一的实例时设置几个成员变量一样简单,即 m_rowOffset
、 m_columnOffset
等。
但是,您无法对指针的工作方式执行任何操作。 指针是简单而愚蠢的生物,你不能让它们以不同的方式工作以适应你的目的。 如果将1
添加到指针,它只会前进到下一个对象(即前进n * sizeof(T)
字节) 坚持索引方法。 反正更自然。
我当然不鼓励你使用多维数组和中缀运算符。
一个幼稚的起点将是这样的简单界面。
class Table {
public:
virtual ~Table() {}
virtual double get(size_t row, size_t col) const = 0;
virtual void getRow(size_t row, std::vector<double> &row_vals) const = 0;
virtual void getCol(size_t col, std::vector<double> &col_vals) const = 0;
virtual void set(size_t row, size_t col, double val) = 0;
virtual void setRow(size_t row, const std::vector<double> &row_vals) = 0;
virtual void setCol(size_t col, const std::vector<double> &col_vals) = 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**”