这就是我现在所拥有的(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));
无论我如何改变功能,它似乎总是失败一个或另一个测试。你如何重载这个运算符?基本上我只需要比较两个空终止字符数组,看看哪个是较小的(没有任何库)。
答案 0 :(得分:2)
您可以利用以null结尾的字符串来简化基本算法:
n
字符相同(从0开始递增n
):n
字符都是'\0'
,则字符串显然是相同的,否则: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,您需要将l
和r
类型更改为unsigned char
但更简单的解决方案是:
return strcmp( str, rhs.str ) < 0;