【问题标题】:why dummy value after vector opertor+?为什么向量运算符+之后的虚拟值?
【发布时间】:2018-03-13 06:09:05
【问题描述】:

我实现了向量。所以我测试了操作符,但是操作符+不能正常工作。

这里是头文件 MyDoubleVector.h

class MyDoubleVector {
public:
    MyDoubleVector();

    MyDoubleVector(size_t init_capacity);

    MyDoubleVector(const MyDoubleVector& v);

    ~MyDoubleVector();

    MyDoubleVector& operator=(const MyDoubleVector& v); //for deep copy

    bool operator==(const MyDoubleVector& v); //binary

    MyDoubleVector& operator+=(const MyDoubleVector& add);

    MyDoubleVector operator[](int index); //return reference to data that requested index

    MyDoubleVector operator+(const MyDoubleVector& rhs); //binary

    MyDoubleVector operator-(const MyDoubleVector& rhs); //binary

    MyDoubleVector operator*(const MyDoubleVector& rhs); //binary

    MyDoubleVector operator-(); //unary

    MyDoubleVector operator()(); //unary

    void pop_back();

    void push_back(double x);

    size_t capacity() const; 

    size_t size() const; 

    void reserve(size_t n); 

    bool empty() const; 

    void clear(); 

    void print_info();

private:
    double *data;
    size_t capa;
    size_t used;

};

这里是实现代码“MyDoubleVector.cpp”

MyDoubleVector MyDoubleVector::operator+(const MyDoubleVector &rhs) { //binary
//pre : same size, 
//poset : return sum,
  if (capa != rhs.capa) {
      exit(1);
  }
  MyDoubleVector tmp(capa);
  for (size_t i = 0; i < capa; i++) {
      tmp.data[i] = data[i] + rhs.data[i];
  }
  return tmp;
};

主要代码是

int i = 0;

MyDoubleVector v1(3);
for (i = 0; i < 4; i++) {
    v1.push_back(i);
}
cout << "v1" << endl;
v1.print_info();

MyDoubleVector v2(3);
for (i = 0; i < 4; i++) {
    v2.push_back(i * 10);
}
cout << "v2" << endl;
v2.print_info();

cout << "(v1+v2)" << endl;
(v1+v2).print_info();

输出是

v1

0 1 2 3

使用:4,容量:4

v2

0 10 20 30

使用:4,容量:4

(v1+v2)

-6.27744e+66 -6.27744e+66 -6.27744e+66 -6.27744e+66

使用:0,容量:4

我认为当 print_info() 函数执行时,reruned tmp 被释放。

如何正确打印矢量?

【问题讨论】:

  • 您确定您的复制构造函数正常工作吗?它会进行复制吗?
  • 你需要学习how to debug small programs
  • 与您的问题无关,但我也建议您花点时间阅读the canonical implementation of binary arithmetic operators。在您的情况下,建议 operator+ 函数是非成员函数,使用成员函数 operator+= 实现。
  • [OT3]:您不希望向量具有相同的 size 而不是 capacity
  • 最后一件事:虽然您的 operator+(以及您的 operator+= 我假设)在某种程度上可能有意义,但对于 容器 来说却没有意义透视图,其中+ 运算符通常附加 两个容器。您的课程更像是 std::valarray 的重新实现而不是 std::vector

标签: c++ vector operator-keyword


【解决方案1】:

您没有设置返回向量的used。在没有看到该类的其余实现的情况下,我想您可以更改为:

MyDoubleVector MyDoubleVector::operator+(const MyDoubleVector &rhs) { //binary
//pre : same size, 
//poset : return sum,
  if (capa != rhs.capa) {
      exit(1);
  }
  MyDoubleVector tmp(capa);
  for (size_t i = 0; i < capa; i++) {
      tmp.push_back(data[i] + rhs.data[i]);
  }
  return tmp;
};

【讨论】:

  • 感谢您的评论!我注意到“它会做深拷贝吗?”。我错过了使用过的副本...TT 我修复了错误,谢谢!
猜你喜欢
  • 2017-12-10
  • 2010-10-14
  • 2017-03-16
  • 2021-09-15
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多