我定义了一个矩阵类,并重载了+运算符,以便能够将这个类的实例一起添加。
class Matrix{
public:
vector<vector<int>> a;
Matrix & operator+(const Matrix& b)
{
vector<vector<int>>::const_iterator it0=b.a.begin();
vector<vector<int>>::iterator it1=this->a.begin();
vector<int>::iterator it2=it1->begin();
vector<int>::iterator it3=it1->end();
vector<int>::const_iterator it01=it0->begin();
for(it1;it1!=this->a.end();it1++)
{
it2=it1->begin();
it3=it1->end();
it01=it0->begin();
it0++;
// a.begin(),a.end(),b.begin(),ret.begin()
std::transform(it2,it3,it01,it2,std::plus<int>());
}
return *this;
}
};
但是,还有另一种方法,
class Matrix{
public:
vector<vector<int> > a;
Matrix & operator + (const Matrix &y) {
for (int m=0; m<y.a.size(); ++m) {
for (int n=0; n<y.a[0].size(); ++n) {
this->a[m][n] = this->a[m][n] + y.a[m][n];
}
}
return *this;
}};
第二种形式更短,但直接使用数组,而第一种形式使用迭代器。也许可以用更短的方式用迭代器来做这件事,我不确定。我已经用简单的案例进行了测试,它们似乎同样有效。 这样做的正确方法是什么?
答案 0 :(得分:0)
对于非平凡的类(例如包括std::vector
的类),就地操作通常比分配新对象便宜,然后(可能)破坏一个或两个参数。但是,积极使用rvalue引用重载可以在一定程度上缓解这种情况。
请注意,无论我使用哪种函数实现,我都不会使用嵌套 std::vector
- 我会使用单个std::vector
或更好的{{1}然后将索引计算为std::unique_ptr<T[]>
(记得边界检查首先)。