1

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

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

4

2 回答 2

5

好吧,我需要在这里提出几点。

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

  • 如果你的意思是字符串std::string,那么你也不能重载 operator ==,因为它已经重载了:)

  • 为了进行不区分大小写的比较,最好的方法是使用命名函数,例如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::transformand而不是循环std::equal,但我认为这更有效。

于 2013-03-19T07:55:03.917 回答
2

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

operator==将 any 重载为除真正相等之外的任何内容也是不可取的。即如果a == b那么ab应该表现相同

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

bool areEqualIgnoringCase(const std::string&, const std::string&);
于 2013-03-19T07:56:05.300 回答