【问题标题】:How to use == operator to compare elements of an array如何使用 == 运算符比较数组的元素
【发布时间】:2016-04-21 16:31:01
【问题描述】:

编写一个包含整数数组作为数据成员的类 Array。该类包含以下成员函数:

  1. 将数组元素初始化为 -1 的构造函数。
  2. 输入函数用于输入数组中的值。
  3. 显示函数以显示数组的值。
  4. 重载 == 运算符来比较两个对象的值。如果两个对象的所有值都相同,则重载函数返回 1,否则返回 0。

问题:我不知道如何使用 == 运算符进行比较。

我的代码:

#include<iostream>
using namespace std;
#define SIZE 10
class array{
public:
    int arr[SIZE];
public: 
    array(){
        for (int i = 0; i < SIZE; i++){

            a[i] = -1;
        }
    }

    void input(){
-       cout << "Enter values";
        for (int i = 0; i < SIZE; i++){
            cout << "Enter value number" << i + 1;
            cin >> arr[i];
        }
    }

    void show(){
        for (int i = 0; i < SIZE; i++){
            cout << arr[i];
        }

    }

    bool operator==(array& p) const
    {
        bool result = true;
        if (p.a != arr)
            result = false;

        return result;
    }
};



int main(){

    array arr, b, c;
    a.input();
    b.input();
    a.show(); b.show();

        return 0;
}

【问题讨论】:

  • 好吧,看来它归结为比较数组。课外你会怎么做?
  • 除非this == &amp;ptrue,否则您的运算符实现将始终返回false。您可能想一一比较数组的元素。顺便说一句:使用using namespace std; 并使用名为array 的类可能会给您带来麻烦。
  • @Drop 使用 for 循环。

标签: c++ arrays operator-overloading


【解决方案1】:

你真正想要的可能是:

bool operator==(const array& p) const
             // ^^^^^
{
    if(this == &p)
        return true;
    for(size_t i = 0; i < SIZE; ++i) {
        if(arr[i] != p.arr[i])
        // ^^^         ^^^
            return false;
    }

    return true;
}

请注意,您的代码中还有一些其他错误:

array(){
    for (size_t i = 0; i < SIZE; i++){
      // ^^^^^^

        arr[i] = -1;
     // ^^^
    }
}

【讨论】:

    【解决方案2】:

    你对平等的定义是什么?我假设您的意思是尺寸相同,所有元素都相同。如果是这种情况,请编写这样的代码。

    bool operator==(array& p) const
    {
      // are size ==, yes they are hard coded to 20 ! not a good plan
      for (int i = 0; i < 20 ; i++)
      {
    
         if(a[i] != p.a[i])
            return false;
      }
      return true;
    }
    

    您编写的代码说如果两个数组具有相同的地址,则它们是相等的。即如果它是同一个数组。也许这就是你的意思

    【讨论】:

    • 你为什么使用this?你也用错了this
    • 相等的数组意味着每个元素应该是相同的值。
    • @NathanOliver 因为我期待 intellisense 为我填写内容(认真的),但我忘记了我输入的是 c++ 而不是 c#,反正有人修好了
    【解决方案3】:

    你不能像这样比较数组:

    if (p.a != arr)
    

    这会将点数组衰减为指针,然后进行指针比较。只有&amp;p == this 时,指针比较才会成立,这不是您想要的。您实际上需要使用循环手动比较数组中的所有元素:

    bool operator==(array const& p) const {
        for (int i = 0; i < SIZE; ++i) {
            if (arr[i] != p.arr[i]) {
                return false;
            }
        }
        return true;
    }    
    

    或者你可以只使用算法std::equal

    bool operator==(array const& p) const
    {
        return std::equal(std::begin(arr), std::end(arr), std::begin(p.arr));
    }
    

    或者您可以改用std::array,它为您定义了自己的operator==

    class array{
        std::array<int, SIZE> arr;
    public:
        bool operator==(array const& p) const {
            return arr == p.arr;
        }
    };
    

    尽管这可能会破坏整个练习的目的。

    【讨论】:

      【解决方案4】:

      你需要使用标准算法来简化这段代码。

      要比较是否相等,请使用std::equal

      对于输入,std::copy && std::istream_iterator

      要填充固定值,请参阅here

      如上所述,您可以使用std::array,而不是您自己的类,它不会增加太多。

      所有这些技术在 Scott Myers 的“Effective STL”中都有很好的描述

      最后,如果你觉得输入 begin/end 很乏味,你可以试试 boost range 库,但我建议先学习 std 版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-14
        • 1970-01-01
        • 2012-10-05
        • 2018-03-19
        相关资源
        最近更新 更多