C++ - 为学校构建自己的字符串类,无法正确重载<运算符

C++ - Building my own String class for school, can't overload < operator correctly

本文关键字:重载 lt 运算符 构建 为学校 自己的 字符串 C++      更新时间:2023-10-16

这是我现在的(str是一个动态的,null终止的字符数组):

bool String::operator<(const String& rhs) const {
    if (str == rhs.str)
        return false;
    int i = 0;
    while (str[i] != '' && rhs[i] != '') {
        if (str[i] > rhs[i])
            return false;
        ++i;
    }
    return true;
}

这通过了大多数测试,但在

String s1("abc");
String s2("abcde");
assert(!(s2 < s1));

无论我如何改变函数,它似乎总是不能通过这样或那样的测试。如何重载这个操作符?基本上,我只需要比较两个以null结尾的字符数组,看看哪个较小(不需要任何库)。

可以利用以空结尾的字符串将基本算法简化为:

  1. 当两个字符串的n第1个字符相同时(n从0开始递增):
  2. 如果两个字符串的n第1个字符为'',则两个字符串明显相同,否则:
  3. 否则,将n的第5个字符作为无符号值进行比较,以确定比较结果。

如果你将循环设置为:

int i = 0;
while (true) {
    char l = str[i];
    char r = rhs.str[i++];
    if( l < r ) return true;
    if( l == 0 || l > r ) return false;
}

应该可以。注意,如果您需要正确处理国家字母(通常值> 127),则需要将lr类型更改为unsigned char

但更简单的解决方案是:

return strcmp( str, rhs.str ) < 0;