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