[英]C++ multidimensional array operator
是否可以为多维数组以某种方式重载运算符?
就像是:
class A {
...
int& operator[][] (const int x, const int y);
...
}
不,这是不可能的。 但有两种选择:
你可以让operator[]
返回一个较小维度的数组(对于一个3D数组,它将返回一个二维数组,对于二维数组,它将返回一维数组;对于一维数组,它将返回一个单独的元素) 。 然后你可以用你想要的语法“将它们串在一起”。 ( arr[x][y][z]
)
或者,您可以重载operator()
,因为它可以采用多个参数。
然后你可以像这样使用它来索引到一个3D数组,例如: arr(x,y,z)
但是你不能将[][]
或[][][]
作为单个运算符重载。
不是直接的,但你可以实现相同的功能重载operator[]()
并让它返回支持operator[]()
本身的东西。
例如:
class A {
std::vector<std::vector<int> > vec;
public:
std::vector<int>& operator[] (int x)
{
return vec[x];
}
};
会允许你写:
A a;
//...
int y = a[1][2];
因为a[1]
返回一个std::vector<int>
,你可以应用operator[](2)
。
你需要重载operator[]
并使它返回一个只有另一个operator[]
的新类。
不,只有operator[]
。 作为替代方案,您可以重载:
int &operator()(int x, int y);
你可以用它:
m(4, 5);
它是一个单独的运算符,用于两次取消引用。 您可以取消引用[]
运算符,并通过更改返回类型将其用作[][]
来执行功能和用法。
没有这样的运营商。 我不久前实现了一个试图接近stl标准的矩阵。 我使用了这个方法:首先我重载了operator []以返回另一个叫做_C_row的类:
_C_row operator[](size_type index) { return _C_row(/*some parameters*/); } ///< This operator is overloaded to permit the use of double pointer notation.
_C_row operator[](size_type index) const { return _C_row(/*some parameters*/); } ///< This operator is overloaded to permit the use of double pointer notation.
在_C_row中,我比运算符[]重载了更多:
value_type operator*() { return _r[0]; }
pointer operator->() { return _i[_idx]; }
double_pointer operator&() { return &(_i[_idx]); }
reference operator[](size_type col) { return _r[col]; }
const_reference operator[](size_type col) const { return _r[col]; }
我发现这个解决方案非常灵活。 我希望我的回答对你有用。
如前所述,没有operator [] []这样的东西。 但是,这是一个使用类似于“jalf”提出的嵌套类的实现。 为简单起见,我硬编码了一个3x3原始数组。
class Array2D final{
public:
class PartialArr final{
private:
friend Array2D;
PartialArr(Array2D* ptr, int index) :original(ptr), firstIndex(index) {}
int firstIndex;
Array2D* original;
public:
int& operator[](int index) { return this->original->data[firstIndex][index]; }
};
PartialArr operator[](int index) { return PartialArr(this, index); }
private:
int data[3][3];
};
此解决方案可防止Array2D用户在仅索引数组的第一个维度时直接操作数据。
还可以添加operator []的const版本以使类完整。
从 C++23 开始,重载的operator[]
现在将采用 0 个或多个参数,其行为与operator()
完全相同
class A {
// ...
int& operator[](std::size_t x, std::size_t j);
// ...
};
调用:
A a = /* ... */;
a[1, 2]; // equivalent to 'a.operator[](1, 2)'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.