C ++ - 为学校构建我自己的String类,不能重载<运算符正确

时间:2016-10-15 19:35:25

标签: c++ arrays string operator-overloading

这就是我现在所拥有的(str是一个动态的,以null结尾的char数组):

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

这通过了大多数测试,但它失败了:

String s1("abc");
String s2("abcde");

assert(!(s2 < s1));

无论我如何改变功能,它似乎总是失败一个或另一个测试。你如何重载这个运算符?基本上我只需要比较两个空终止字符数组,看看哪个是较小的(没有任何库)。

2 个答案:

答案 0 :(得分:2)

您可以利用以null结尾的字符串来简化基本算法:

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

答案 1 :(得分:1)

如果您将循环更改为:

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;
}

它应该有用。请注意,如果您需要正确处理国家字母表,那么通常值为&gt; 127,您需要将lr类型更改为unsigned char

但更简单的解决方案是:

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