How do I overload the == operator for the string class in c++?
我是一个新的c++程序员,我最近才了解运算符重载。在处理一个独立的项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以允许用户浏览一个简单的菜单。唯一的问题是我不知道如何比较两个字符串,而忽略了这个情况。如果有比重载==运算符更简单的方法,请让我知道,但也让我知道如何重载==运算符的字符串,因为我非常感兴趣。
多好的社区啊。多谢各位,你很快就回答了我的问题,没有让我觉得自己很傻!
- 有效STL第35项。
- 我已经读过那篇文章了。它没有回答我的要求。
- 这里有相关的例子。
- 谢谢,不过我想我的问题已经回答了。等待3分钟选择接受的答案。:)
好吧,我需要在这里说几点。
如果按字符串表示字符数组/指针,则不能重载operator==,因为只允许用户定义类型使用运算符重载
如果字符串的意思是std::string,那么就不能重载operator==either,因为它已经被重载了:)
为了进行不区分大小写的比较,最好的方法是有一个命名函数,如case_insensitive_equal。Boost有一个-boost::iequals(str1, str2)。
您可以尝试编写自己的char_traits来创建不区分大小写的字符串类型。
关于如何以不区分大小写的方式编写比较字符串的函数,我将这样做:
1 2 3 4 5 6 7 8 9
| 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::transform和std::equal,而不是循环,但我认为这样更有效。
- 谢谢!这真的有帮助。但为什么您需要将&;置于s1和s2之前?在这种情况下,您不会真正更改字符串的值。
- @安东:是的,事实上,我不是,这就是为什么那里有一个const。我通过引用传递参数以避免不必要的复制
- 好吧,这只是为了保存记忆?
- @安东尼:避免复制不会节省内存。它节省时间。如果有两个1MB字符串,将它们复制到函数中需要相当长的时间,而绝对不需要
- 我认为你可以不使用std::transform,使用std::equal。有一个采用二进制谓词的重载。
- @是的,你是对的,我忘了:)
- 您的代码只能用于基于ASCII的区域设置…
对于std::string,您不会重载operator==,因为您必须将运算符放入std命名空间。这是(a)不允许的,并且(b)已经由标准库实现完成。
也不建议让任何一个operator==过载,以表示真正的平等以外的任何东西。也就是说,如果a == b,那么a和b的行为应该相同。
您应该更喜欢使用一个有意义的名称编写一个单独的函数,例如
1
| bool areEqualIgnoringCase(const std::string&, const std::string&); |
- 不确定是否需要修改std命名空间…
- @阿列克谢·张伯伦:你还怎么写《江户记》1(4)和《江户记》1(5)呢?
- namespace ADC { bool operator==(std::string const&, std::string const&); }不确定它是否适用于已经有operator==的std::string。
- @当然,如果你愿意这样打电话给你的接线员:ADC::operator == (s1, s2);d