6

是否可以为多维数组以某种方式重载运算符?

就像是:

class A {
  ...
  int& operator[][] (const int x, const int y);
  ...
}
4

8 回答 8

12

不,那是不可能的。不过,有两种选择:

您可以operator[]返回一个较小维度的数组(对于 3D 数组,它将返回一个 2D 数组,对于 2D 数组,它将返回一个 1D 数组,对于 1D 数组,它将返回一个元素)。然后你可以用你想要的语法“把它们串在一起”。( arr[x][y][z])

或者,您可以重载operator(),因为它可以采用多个参数。

然后您可以像这样使用它来索引 3D 数组,例如:arr(x,y,z)

但是您不能重载[][][][][]作为单个运算符。

于 2012-10-18T15:45:41.943 回答
4

不是直接的,但您可以实现相同的功能重载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)的。

于 2012-10-18T15:43:47.857 回答
2

您需要重载operator[]并使其返回一个只有另一个operator[].

于 2012-10-18T15:43:42.707 回答
2

不,只有operator[]. 作为替代方案,您可以重载:

int &operator()(int x, int y);

你可以使用它:

m(4, 5);
于 2012-10-18T15:44:18.827 回答
0

它是一个运算符被使用两次来取消引用。您可以取消引用[]运算符并[][]通过更改返回类型来使用它来执行功能和用法。

于 2012-10-18T15:43:21.507 回答
0

没有这样的运营商。前段时间,我实现了一个试图接近 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 中,我重载的不仅仅是 operator[]:

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]; }

我发现这个解决方案非常灵活。希望我的回答对你有用。

于 2013-12-18T10:59:30.757 回答
0

如前所述,没有 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 版本以使类完整。

于 2019-05-03T16:04:24.050 回答
0

从 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)'
于 2021-12-21T12:16:02.827 回答