C ++多维数组运算符

时间:2012-10-18 15:40:36

标签: c++

有可能为多维数组重载某种操作符吗?

类似的东西:

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

7 个答案:

答案 0 :(得分:8)

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

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

或者,您可以重载operator(),因为这可能需要多个参数。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您需要重载operator[]并让它返回一个只有另一个operator[]的新类。

答案 3 :(得分:1)

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

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

您可以使用:

m(4, 5);

答案 4 :(得分:0)

单个运算符被用于两次取消引用。您可以取消引用[]运算符,并通过更改返回类型将其用作[][]来执行功能和用法。

答案 5 :(得分: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中,我超载了运算符[]:

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

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

答案 6 :(得分: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的用户仅在索引数组的第一维时直接操作数据。

还可以添加两个操作符[]的

const版本,以使类完整。