【问题标题】:Overwrite index operation [duplicate]覆盖索引操作[重复]
【发布时间】:2013-06-24 15:41:38
【问题描述】:

我知道在 C++ 中可以覆盖索引操作 [] 并像使用数组一样处理类内部数据。 是否可以覆盖 [][] 并像使用两个维度数组一样工作?

【问题讨论】:

    标签: c++


    【解决方案1】:

    是的,这是可能的(std::vector 就是此类的一个例子)。

    你应该在你的类或结构中重载 operator[]。

    如果您使用正整数来索引数据,可能的签名将是:

    RETURN_TYPE operator[] (size_type n);
    

    UPD:如果您想要以非负整数作为键的二维数据结构,您可以使用向量向量:

    std::vector<std::vector<YOUR_TYPE>> vector_name;
    

    【讨论】:

    • 你有一个例子如何做到这一点。但是 std::vector 不是二维的
    【解决方案2】:

    为了实现它,您需要重载operator[] 以返回一些也具有operator[] 的对象。例如:

    class Proxy {
         std::vector<int>::iterator it;
         //constructor;
         int operator[] (size_t pos) {
             return *(it + pos);
         }
    }
    
    class MyMatrix {
        std::vector<std::vector<int>> v;
        Proxy operator[] (size_t pos) {
            return Proxy(v[pos].begin());
        }
    
    }
    

    【讨论】:

    • 请注意,如果您不进行边界检查,并且使用单维实现,则指针是足够的Proxy:int* operator[]( int i ) { return &amp;v[ i * columns ]; }。同样,如果您的实现,std::vector&lt;int&gt;&amp; 是一个合适的代理。
    【解决方案3】:

    确实可以;按照惯例,您将重载 [] 返回对行类型对象的引用,并在该行类型对象上重载 [] 以产生对标量的引用。

    您还应该考虑重载指针取消引用,以保持[x]*(... + x) 的等效性。

    【讨论】:

    • 您的第二个建议实际上取决于所讨论课程的类型。我真的无法想象std::vector&lt;int&gt; v(100); *(v + 7) = 5; 是合法代码。
    • @Angew;确实。因此需要考虑。如果您正在编写矩阵类,那么我认为您应该这样做。
    【解决方案4】:

    假设您有一个数组arr,只要您想访问arr[x][y],例如它具有(arr[x])[y] 的等价物,因此首先评估arr[x](我们将其命名为a)然后@ 987654326@ 已评估,因此您只需重载 []operator。

    【讨论】:

    • 但是 (arr[x]) - 必须返回一个一维数组,而 a[y] - 一个值,如何为两种不同的返回类型重载一个运算符?
    • @user1913557 数组?没有。它返回一个指针。 [] 运算符的左侧始终是一个指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多