【问题标题】:Overload [][] operator c++ [duplicate]重载[] []运算符c ++ [重复]
【发布时间】:2012-12-22 22:36:29
【问题描述】:

可能重复:
C++ Overloading : Overloading the [][] operator

我有一个类矩阵,它的数据存储在vector<vector<double> > _data 我想重载[][] 运算符以返回_data[row][cols]

我环顾四周,但不太明白如何使用 vectorvector 来做到这一点

我知道我需要重载[] 运算符,但它只接收一个参数。

正在考虑创建一个内部助手类,但我无法完全理解这个。

有什么想法吗?

谢谢

【问题讨论】:

  • 您是否尝试使用 [rox][cols] 大小初始化向量的向量?如果是这样,我会发布一个答案
  • 没有[][]这样的操作符,所以你不能重载它。
  • 其实是的,如果操作得当,他可以访问_data[1][1]。
  • C++ Faq Lite 已获得few entries on this
  • @DmitryKvochkin 您的示例使用两个operator[]s。没有 operator[][] 这样的东西。

标签: c++ vector operator-overloading


【解决方案1】:

你至少有两个选择:

  1. 创建一个自定义的MatrixRow 类,用于存储矩阵的单行。此类可以重载operator[]() 以返回行中的元素。然后你的矩阵类重载它自己的operator[]() 以返回一个MatrixRow

  2. 在矩阵类中重载 operator[]() 以返回 vector<double>。然后你就可以免费获得第二个operator[]()

【讨论】:

  • 您的回答是完整的,应该指出 OP 要求的 operator[][] 不存在也不可能存在。
【解决方案2】:

据我所知,您正在尝试创建二维向量。 所以,你可以这样做:

vector <vector<double>> _data;

vector <double> vec_d; // temporary helpful vector
double d=NULL;

for(int i=0;i<column_size;i++){
            _data.push_back(vec_d);

            for(int j=0;row_size<l;j++)
                _data[i].push_back(d);
    }

完成此操作后,您可以通过以下方式访问您的数据:

_data[1][0] = 1.5;

【讨论】:

  • 我认为这就是他想要达到的目标
  • 我什至不知道这是在做什么。
  • @DmitryKvochkin:OP 没有写任何关于迫使他重载[] 运算符的情况,他只是问如何重载[][] 运算符(不存在)
  • 好吧,如果您阅读了问题的 cmets,他回答说这正是他想要达到的目标......
  • @DmitryKvochkin:我现在明白了。不过你应该写点东西,完全不清楚你为什么在这里写这个sn-p代码,它应该做什么以及它应该如何帮助他。此外,您的初始化是在构造矢量对象之后进行的。如果他需要在构造向量对象本身时在构造函数中对其进行初始化怎么办......这里要责备的是OP,因为他提出问题的方式......他只是没有提供任何关于它的细节。
【解决方案3】:

怎么样:

double& operator()(size_t row, size_t col) {
    return _data[row][col];
}

// ...
m(2,4) = 10.3;

它不完全相同,但在语法上几乎一样方便,并且它抽象了底层实现(因此,如果您决定仅使用一个向量 (1D) 并计算正确的索引以使其显示为 2D,它将做起来容易)。

顺便说一句:使用嵌套向量会产生额外的内存(和查找)开销,这是您可能不想要的。

【讨论】:

  • 那不合法,你的意思是operator()(...
  • 哦,是的,你是对的。修好了。
猜你喜欢
  • 2011-10-27
  • 2016-09-26
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2016-06-27
  • 2020-01-14
相关资源
最近更新 更多