C++多维数组运算符
C++ multidimensional array operator
多维数组是否可以以某种方式重载运算符?
像这样:
class A {
...
int& operator[][] (const int x, const int y);
...
}
不,这是不可能的。不过,有两种选择:
您可以operator[]
返回较小维度的数组(对于 3D 数组,它将返回一个 2D 数组,对于 2D 数组,它将返回一个 1D 数组,对于 1D 数组,它将返回单个元素)。然后,您可以使用所需的语法将它们"串在一起"。(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]
返回一个可以应用operator[](2)
的std::vector<int>
。
你需要重载operator[]
并让它返回一个只有另一个operator[]
的新类。
不,只有operator[]
.作为替代方法,您可以重载:
int &operator()(int x, int y);
您可以使用它:
m(4, 5);
自 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)'
它是一个使用两次来取消引用的运算符。您可以取消引用运算符[]
并通过更改返回类型将其用作[][]
来执行功能和用法。
没有这样的运算符。前段时间,我实现了一个矩阵,试图接近 stl 标准。 我使用了这种方法:首先,我重载了运算符 [] 以返回我调用的另一个类_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]; }
我发现这个解决方案非常灵活。我希望我的回答对您有用。
如前所述,没有运算符[][]这样的东西。 但是,这是一个使用嵌套类的实现,类似于"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 的用户在仅索引数组的第一维时直接操作数据。
还可以添加两个运算符 [] 的 const 版本以使类完整。
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 你能在C++的数组 i,e(+、-、*、/) 中存储算术运算符吗?
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何重载下标运算符 [] 以引用 2d STL 数组?
- 动态数组的 C++ 重载加运算符
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 为什么我在声明对象数组时不能使用 -> 运算符?
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 为什么重载运算符"="动态数组的类上无法正常工作?C++
- 如何将数组的重载运算符 [] 更改为 ()?
- 如何重载逗号运算符以将值分配给数组
- 如何在C++中使用 new 运算符创建对动态创建的数组的引用?
- c++ 使用动态分配运算符反向数组元素
- 重载运算符 [] 用于从对象数组中给出特定索引
- 使用新运算符C++创建多维数组的简单方法
- 重载运算符后打印二维数组<<
- C++ 中动态数组的赋值运算符
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 试图引用已删除函数数组的相等运算符