家庭作业:检查两个数组的相等性

时间:2018-08-28 13:48:19

标签: c++

我被困在一个作业问题上,该问题要求我创建/修改一个将两个数组设置为相等的函数。问题问:

“使用复制分配(=)运算符将两个数组设置为彼此相等,可以使用以下命令进行检查:

y = x;
cout << "x equals y? " << (x == y) << endl; //Should return "True"

并在以下规则中进行设置:

“请注意,只有两个Array对象具有相同的长度和相同的元素值,才应将它们视为相等。”

这是我拥有的代码,我实现了两个调试部分,这表明它们在赋值函数和main函数上确实相等,因此我的最佳猜测是长度不匹配。我不允许修改提供的任何代码(所有类和函数的东西,或main中调试器之上的任何东西),所以我不确定如何将长度设置为相等,以满足条件(x == y)

#include <iostream>

using namespace std;

// definition

#define MAX_LENGTH 100
#define INIT_VALUE 0

class Array {
public:
  Array(int length);
  Array& operator=(const Array& other);

  int length() const;
  int& operator[](int index);

  bool operator==(const Array& other) const;
  bool operator!=(const Array& other) const;

private:
  int length_;
  int elements_[MAX_LENGTH];
};

// implementation

Array::Array(int length) {
  length_ = length;
  if (length_ > MAX_LENGTH) length_ = MAX_LENGTH;
  for (int i = 0; i < length_; ++i) {
    elements_[i] = INIT_VALUE;
  }
}

Array& Array::operator=(const Array& other)
{
  /*DEBUG*/cout << endl << endl << "<<NOW IN ASSIGNMENT FUNCTION>>" << endl << endl;
  for (int i = 0; i < other.length_; ++i)
  {
    elements_[i] = other.elements_[i];
    /*DEBUG*/cout << endl << "Elements: " << elements_[i] << " | Other Elements: " << other.elements_[i] << endl;
  }

  return *this;
}

int Array::length() const {
  return length_;
}

int& Array::operator[](int index) {
  // Q3 code goes here
  return elements_[index];
}

bool Array::operator==(const Array& other) const
{
  if (length_ != other.length_) return false;
  for (int i = 0; i < other.length_; ++i) {
    if (elements_[i] != other.elements_[i]) return false;
  }
  return true;
}

bool Array::operator!=(const Array& other) const
{
  if (length_ != other.length_)
  {
      return true;
  }

  for (int j = 0; j < other.length_; ++j)
  {
    if (elements_[j] != other.elements_[j]) return true;
  }

  return false;
}

// testing

int main()
{
  Array x(10);
  x[3] = 42;
  cout << "x contains ";
  for (int i = 0; i < x.length(); ++i) {
    cout << x[i] << " ";
  }
  cout << endl;

  Array y(5);
  cout << boolalpha;
  cout << "x equals y? " << (x == y) << endl;
  cout << "x notequals y? " << (x != y) << endl;
  y = x;

  //DEBUG SECTION
  cout << endl << endl << "<<NOW IN MAIN>>" << endl << endl;
  for (int i = 0; i < x.length(); ++i)
  {
    cout << endl << "Elements: " << x[i] << " | Other Elements: " << y[i] << endl;
  }
  //END OF DEBUG SECTION
  cout << "x equals y? " << (x == y) << endl;
}

所以问题是,如何在不修改'main'的情况下使这些数组具有相同的长度?我可以通过分配功能来做到这一点吗?

2 个答案:

答案 0 :(得分:6)

您只是忘记在Array::operator=中分配相同的长度。

这可以通过在

中写入this->length_ = other.length_;来完成。

Array& Array::operator=(const Array& other),然后覆盖数组。

答案 1 :(得分:1)

如前所述,您没有在= operator中正确分配长度。

像这样解决:

Array& Array::operator=(const Array& other)
{
   length_ = other.length_;
   for (int i = 0; i < length_; ++i)
   {
      elements_[i] = other.elements_[i];
   }
   return *this;
}

您还可以大大简化!= operator

bool Array::operator!=(const Array& other) const
{
    return !(*this == other);
}

但是,在我看来,更重要的是,您还应该使用允许动态尺寸(例如std::vector)的std容器。这样也可以避免您的错误。

我认为您应该尽快使用这些std容器并习惯它们。如有疑问,它们几乎总是正确的选择。

使用std::vector,您的程序应如下所示:

#include <iostream>
#include <vector>
using namespace std;

// definition

#define INIT_VALUE 0

class Array {
public:
    Array(int length);
    Array& operator=(const Array& other);

    int length() const;
    int& operator[](int index);

    bool operator==(const Array& other) const;
    bool operator!=(const Array& other) const;

private:
    std::vector<int> elements_;
};

// implementation

Array::Array(int length)
:
elements_(length, INIT_VALUE)
{   
}

Array& Array::operator=(const Array& other)
{
    /*DEBUG*/cout << endl << endl << "<<NOW IN ASSIGNMENT FUNCTION>>" << endl << endl;
    elements_ = other.elements_;

    return *this;
}

int Array::length() const {
    return static_cast<int>(elements_.size());
}

int& Array::operator[](int index) {
    // Q3 code goes here
    return elements_[index];
}

bool Array::operator==(const Array& other) const
{
    return elements_ == other.elements_;
}

bool Array::operator!=(const Array& other) const
{
    return !(*this == other);
}

// testing

int main()
{
    Array x(10);
    x[3] = 42;
    cout << "x contains ";
    for (int i = 0; i < x.length(); ++i) {
        cout << x[i] << " ";
    }
    cout << endl;

    Array y(5);
    cout << boolalpha;
    cout << "x equals y? " << (x == y) << endl;
    cout << "x notequals y? " << (x != y) << endl;
    y = x;

    //DEBUG SECTION
    cout << endl << endl << "<<NOW IN MAIN>>" << endl << endl;
    for (int i = 0; i < x.length(); ++i)
    {
        cout << endl << "Elements: " << x[i] << " | Other Elements: " << y[i] << endl;
    }
    //END OF DEBUG SECTION
    cout << "x equals y? " << (x == y) << endl;
}