【问题标题】:How do I overload the == operator for the string class in c++? [duplicate]如何在 C++ 中为字符串类重载 == 运算符? [复制]
【发布时间】:2013-03-07 19:23:26
【问题描述】:

我是一个新的c++ 程序员,我最近才了解运算符重载。在从事独立项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以允许用户在一个简单的菜单中导航。唯一的事情是我不知道如何在忽略大小写的情况下比较两个字符串。如果有比重载 == 运算符更简单的方法,请告诉我,但也请告诉我如何重载字符串的 == 运算符,因为我很感兴趣。

多么棒的社区。非常感谢你们,你们很快就回答了我的问题,没有让我觉得很笨!

【问题讨论】:

  • 有效 STL 的第 35 条。
  • 我已经阅读了那个帖子。它没有回答我的问题。
  • 有相关例子here.
  • 非常感谢,但我认为我的问题已得到解答。等待 3 分钟以选择接受的答案。 :)

标签: c++ string operator-overloading comparison-operators


【解决方案1】:

好吧,我需要在这里说明几点。

  • 如果字符串是指字符数组/指针,则不能重载运算符 ==,因为运算符重载仅允许用于用户定义的类型

  • 如果你用字符串表示std::string,那么你也不能重载运算符==,因为它已经重载了:)

  • 为了进行不区分大小写的比较,最好的方法是使用命名函数,例如case_insensitive_equal。 Boost 有一个 - boost::iequals(str1, str2)

  • 您可以尝试编写自己的char_traits 来创建不区分大小写的字符串类型

至于如何写一个函数比较字符串不区分大小写,我会这样做:

bool case_insensitive_equal(const std::string& s1, const std::string& s2)
{
    if(s1.length() != s2. length())
       return false;
    for(int i = 0; i < s1.length(); ++i)
        if(std::toupper(s1[i]) != std::toupper(s2[i])) //tolower would do as well
            return false;
    return true;
}

您可以使用std::transformstd::equal 代替循环,但我认为这样更有效。

【讨论】:

  • 非常感谢!这真的很有帮助。但是为什么要在 s1 和 s2 前面加上 & 呢?在这种情况下,您并没有真正改变字符串的值。
  • @Anton:是的,确实,我不是,这就是为什么那里有一个const。我通过引用传递参数以避免不必要的复制
  • 好的,这只是为了节省内存?
  • @AntonYershov:避免复制不会节省内存。它可以节省时间。如果你有两个 1MB 的字符串,将它们复制到函数中需要相当长的时间,而完全没有必要
  • 我认为你可以使用std::equal 而不使用std::transform。有一个采用二元谓词的重载。
【解决方案2】:

您不要为std::string 重载operator==,因为您必须将运算符放入std 命名空间。这是 (a) 不允许的,并且 (b) 标准库实现已经完成了。

不建议重载任何operator== 来表示除真正相等之外的任何内容。 IE。如果a == b 那么ab 的行为应该相同

你应该更喜欢用一个有意义的名字写一个单独的函数,例如

bool areEqualIgnoringCase(const std::string&, const std::string&);

【讨论】:

  • 不确定是否需要修改 std 命名空间...
  • @AlexChamberlain:否则你会怎么写operator== for std::string
  • namespace ADC { bool operator==(std::string const&amp;, std::string const&amp;); } 不确定它是否适用于已经有operator==std::string
  • @AlexChamberlain:当然,如果您愿意这样称呼您的接线员:ADC::operator == (s1, s2);:D
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 2015-10-22
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2013-08-10
相关资源
最近更新 更多