我是一名新的c++
程序员,我最近才了解到运算符重载。在处理独立项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以便用户可以浏览简单的菜单。唯一的问题是我不知道如何比较两个字符串,而忽略了这种情况。如果有一个更简单的方法来执行此操作而不是重载==
运算符,请告诉我,但也让我知道如何为==
运算符重载字符串,因为我非常感兴趣。
多么棒的社区。非常感谢你们,你们很快就回答了我的问题而没有让我感到愚蠢!
答案 0 :(得分:5)
好吧,我需要在这里提出几点意见。
如果用字符串表示字符数组/指针,那么就不能重载operator ==,因为只允许用户定义类型的运算符重载
如果用字符串表示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::transform
和std::equal
代替循环,但我认为这样更有效。
答案 1 :(得分:2)
您不会为operator==
重载std::string
,因为您必须将运算符放入std
命名空间。这是(a)不允许的,(b)已经由标准库实现完成。
除了真正的平等之外,任何operator==
重载都是不可取的。即如果a == b
则a
和b
的行为相同。
您更喜欢做的是编写一个具有有意义名称的单独函数,例如
bool areEqualIgnoringCase(const std::string&, const std::string&);