我是一个新的c++
程序员,我最近才了解操作符重载。在处理独立项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以便用户可以在简单菜单中进行导航。唯一的是我不知道如何比较两个字符串,而忽略了情况。如果有更简单的方法来完成此操作,而不是重载==
操作符,请告诉我,但请让我知道如何将字符串==
过载,因为我对此非常感兴趣。如何在C++中为字符串类重载==运算符?
什么是一个伟大的社区。非常感谢你们,你很快就回答了我的问题,而且没有让我感到愚蠢!
我是一个新的c++
程序员,我最近才了解操作符重载。在处理独立项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以便用户可以在简单菜单中进行导航。唯一的是我不知道如何比较两个字符串,而忽略了情况。如果有更简单的方法来完成此操作,而不是重载==
操作符,请告诉我,但请让我知道如何将字符串==
过载,因为我对此非常感兴趣。如何在C++中为字符串类重载==运算符?
什么是一个伟大的社区。非常感谢你们,你很快就回答了我的问题,而且没有让我感到愚蠢!
那么,我需要在这里提出几点。
如果由字符串你指字符数组/指针,则不能重载运算符==,由于操作符重载只允许用于用户定义类型
如果由字符串你的意思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::transform
和std::equal
,但我认为这样更有效率。
非常感谢!这真的有帮助。但是为什么你需要把&放在s1和s2的前面?在这种情况下,你并没有真正改变字符串的值。 – 2013-03-19 08:04:22
@Anton:的确,我不是,那就是为什么那里有一个'const'的原因。我通过引用传递参数以避免不必要的复制 – 2013-03-19 08:05:09
好吧,这样做只是为了节省内存? – 2013-03-19 08:05:59
对于std::string
,您不会重载operator==
,因为您必须将该运算符放入std
命名空间。这是(a)不允许和(b)标准库实现已经完成。
将任何operator==
重载为意味着除真正的平等之外的任何东西也是不可取的。即如果a == b
则a
和b
应该相同地表现。
你应该更喜欢做的是用一个有意义的名字编写一个单独的函数,例如
bool areEqualIgnoringCase(const std::string&, const std::string&);
不知道你需要修改'std'命名空间...... – 2013-03-19 07:56:50
@AlexChamberlain:别的你会为'std :: string'编写'operator =='吗? – 2013-03-19 07:58:46
'命名空间ADC {布尔运算符==(std :: string const&,std :: string const&); }'不确定它适用于已经有'operator =='的'std :: string'。 – 2013-03-19 08:00:49
有效STL的第35项。 – 2013-03-19 07:55:03
我已经阅读过这个帖子。它没有回答我所问的。 – 2013-03-19 07:58:06
有相关的例子[这里](http://stackoverflow.com/questions/14819696/trouble-with-case-insensitive-partial-matching-two-strings)。 – juanchopanza 2013-03-19 07:58:54