2013-03-19 109 views
1

我是一个新的c++程序员,我最近才了解操作符重载。在处理独立项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以便用户可以在简单菜单中进行导航。唯一的是我不知道如何比较两个字符串,而忽略了情况。如果有更简单的方法来完成此操作,而不是重载==操作符,请告诉我,但请让我知道如何将字符串==过载,因为我对此非常感兴趣。如何在C++中为字符串类重载==运算符?

什么是一个伟大的社区。非常感谢你们,你很快就回答了我的问题,而且没有让我感到愚蠢!

+1

有效STL的第35项。 – 2013-03-19 07:55:03

+0

我已经阅读过这个帖子。它没有回答我所问的。 – 2013-03-19 07:58:06

+0

有相关的例子[这里](http://stackoverflow.com/questions/14819696/trouble-with-case-insensitive-partial-matching-two-strings)。 – juanchopanza 2013-03-19 07:58:54

回答

5

那么,我需要在这里提出几点。

  • 如果由字符串你指字符数组/指针,则不能重载运算符==,由于操作符重载只允许用于用户定义类型

  • 如果由字符串你的意思std::string,则因为它已经超载:)

  • 为了做不区分大小写的比较,最好的办法是有一个命名的函数,如case_insensitive_equal。升压有一个 - 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,但我认为这样更有效率。

+0

非常感谢!这真的有帮助。但是为什么你需要把&放在s1和s2的前面?在这种情况下,你并没有真正改变字符串的值。 – 2013-03-19 08:04:22

+0

@Anton:的确,我不是,那就是为什么那里有一个'const'的原因。我通过引用传递参数以避免不必要的复制 – 2013-03-19 08:05:09

+0

好吧,这样做只是为了节省内存? – 2013-03-19 08:05:59

2

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

将任何operator==重载为意味着除真正的平等之外的任何东西也是不可取的。即如果a == bab应该相同地表现

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

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

不知道你需要修改'std'命名空间...... – 2013-03-19 07:56:50

+0

@AlexChamberlain:别的你会为'std :: string'编写'operator =='吗? – 2013-03-19 07:58:46

+0

'命名空间ADC {布尔运算符==(std :: string const&,std :: string const&); }'不确定它适用于已经有'operator =='的'std :: string'。 – 2013-03-19 08:00:49