如何重载c++中string类的==操作符?
How do I overload the == operator for the string class in c++?
我是一个新的c++
程序员,我最近才学习操作符重载。当我在一个独立的项目中工作时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以便允许用户在一个简单的菜单中导航。唯一的问题是我不知道如何在忽略大小写的情况下比较两个字符串。如果有比重载==
操作符更简单的方法,请告诉我,也请告诉我如何重载字符串的==
操作符,因为我很感兴趣。
真是一个伟大的社区。非常感谢你们,你们很快就回答了我的问题,没有让我觉得自己很笨!
这里我需要说明几点。
-
如果你的字符串指的是char数组/指针,那么你不能重载operator ==,因为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
代替循环,但我认为这样更有效率。
您不能为std::string
重载operator==
,因为您必须将操作符放入std
命名空间。这是(a)不允许的,并且(b)标准库实现已经完成了。
也不建议重载任何operator==
来表示除真正相等之外的任何东西。例如,如果a == b
,那么a
和b
的行为应该相同。
你应该写一个有意义的名字的单独的函数,例如
bool areEqualIgnoringCase(const std::string&, const std::string&);
相关文章:
- 具有默认模板参数的多态类的模板推导失败
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- std::具有相同基类的类的变体
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 附加类型安全的子类std::string
- 将一个常量cstring附加到我自己的String类对象
- 不要使用 "const char *" 作为类的成员,如果你真的是"std::string"
- 使用String.h制作简单的String类
- 使用C++中的String To Class Lookup表来实例化类
- c++中的string类可以有多大?
- 将从std::string派生的类派生的类的数据成员设置为值
- 从 std::string 到类的隐式转换不起作用
- 为Rcpp提供String类的好处是什么?
- 使用我自己的String类和<<操作符
- 带有自定义类的范围循环(矢量的简单版本<string>,使用分配器)
- 如何重载c++中string类的==操作符?
- 创建一个指向包含string的新类的指针
- 操作符重载——创建一个新的string类
- 从返回类型为用户定义string类的函数返回std::string时出错