我正在为 C++ 中的几个线性代数库编写包装器代码,这些库可以以多种格式之一存储它们的数组,最常见的是密集列优先、密集行优先、压缩稀疏列和压缩稀疏行。我想创建一个数组包装类,它将以通用顺序访问这些数组的元素,同时保持基础库所需的底层内存顺序;也就是说,我希望能够使用基于行的索引以相同的方式访问包装的列优先密集数组和包装的行优先密集数组的元素。我无法在不干扰外部库功能的情况下重新排序底层数组,并且考虑到我的数组的巨大大小,重新排序无论如何都会涉及大量计算成本。这就是我的意思,假设两者都'
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
本质上,我的目标是让底层库能够使用与它们本机使用的相同内存顺序来访问包装数组,同时使我的包装器代码能够透明地访问数据,而无需担心底层内存顺序。我不在乎我是使用指针还是索引语法,因为我可以做任何我需要的事情,只要我能正确访问行和元素;如果我只能直接实现指针,那么无论如何我都会重载索引运算符,以便与其他外部运算符重载库轻松集成。
提前感谢大家的帮助。