【问题标题】:C++ Char Class Operator< function compareC++ Char 类运算符<函数比较
【发布时间】:2020-09-24 03:31:12
【问题描述】:
bool String::operator < (const String &s) const 
{
int len1 = s.getLength();
int len2 = this->getLength();
int cap;
if(len1>len2) cap = len2;
else cap = len1;
int index=0;
for (int i =0; i < cap;i++)
    if (this->buffer[i] != s[i])
        index =i;
for (int i= index; i < cap; i++)
    if (this->buffer[i] < s[i])
        return true;
for (int i= index; i < cap; i++)
    if (this->buffer[i] > s[i])
        return false;
if (*this == s)
    return false;
if (len2>len1)
    return false;
if (len2<len1)
    return true;
}

我一直在使用这个重载运算符

它正在成功运行。我尽可能测试每一个案例。

但是当我 F7 程序时,它仍然显示 'String::operator

请告诉我我在这个函数中缺少什么?

【问题讨论】:

  • 如果您确定您已经处理了所有案例,那么您可以在最后一个 return 之前删除 if (len2&lt;len1) 条件 - 如果它确实是最后一个剩余案例,则它必须始终为真。跨度>
  • @IgorTandetnik 是的,我试图删除最后一个如果离开,但如果我这样做,结果将不正确例如:“Test”和“Test1”
  • 如果放弃最后一个条件会改变结果,那么您还没有处理所有可能的情况。如果您到达if (len2&lt;len1) 行,结果发现条件不成立并且len2 实际上等于len1,那么您的函数会在没有返回的情况下退出,并且编译器可以正确地抱怨。如果在那一行len2 总是小于len1,那么条件总是为真并且放弃检查不应该改变结果。你不能同时拥有它;您提出了两个相互矛盾的主张。
  • 最后,你的函数声明了"bb" &lt; "ac"。你是这个意思吗?
  • @IgorTandetnik 是的,当我尝试“bb”和“ac”时,它显示错误的结果......为什么

标签: c++ string class overloading operator-keyword


【解决方案1】:

如果你的循环不是return,如果*this == s 为假(你不应该在这个函数中进行比较),如果len2&gt;len1len2&lt;len1 都是假的(意思是@987654325 @ 是真的),那么您确实缺少最终的return,这是编译器警告您的内容。

bool String::operator < (const String &s) const 
{
    ...

    if (len2>len1)
        return false;
    if (len2<len1)
        return true;

    // IF YOU REACH HERE, THERE IS NO RETURN!
}

话虽如此,您的代码可以简化一点:

bool String::operator < (const String &s) const 
{
    int len1 = this->getLength();
    int len2 = s.getLength();
    int cap = (len1 < len2) ? len1 : len2;
    for (int i = 0; i < cap; ++i) {
        if (this->buffer[i] != s[i]) {
            return (this->buffer[i] < s[i]);
        }
    }
    return (len1 < len2);
}

或者,您可以使用std::mismatch()

#include <algorithm>

bool String::operator < (const String &s) const 
{
    int len1 = this->getLength();
    int len2 = s.getLength();
    int cap = std::min(len1, len2);
    const char* buffer_end = this->buffer + cap;
    std::pair<const char*, const char*> ret = std::mismatch(this->buffer, buffer_end, s.buffer);
    return (ret.first != buffer_end)
        ? (*ret.first < *ret.second)
        : (len1 < len2);
}

或者,在 C++14 及更高版本中:

#include <algorithm>

bool String::operator < (const String &s) const 
{
    int len1 = this->getLength();
    int len2 = s.getLength();
    const char* buffer_end = this->buffer + len1;
    const char* s_end = s.buffer + len2;
    auto ret = std::mismatch(this->buffer, buffer_end, s.buffer, e_end);
    return ((ret.first != buffer_end) && (ret.second != s_end))
        ? (*ret.first < *ret.second)
        : (len1 < len2);
}

【讨论】:

  • 在你给出的第二个中,“if (this->buffer[i] != s[i]) { return (this->buffer[i] buffer[i]
  • @HoangMy 在您的原始代码中,当第一个循环检测到this-&gt;buffer[i] 不等于s[i] 时,它会将i 保存到index(顺便说一句,之后您会错过break ),然后使后续循环无用。它们最多只迭代 0 或 1 次,如果 1 次总是调用 return (true|false),因为 this-&gt;buffer[i] 保证小于或大于 s[i]i == index,因为第一个循环确保this-&gt;buffer[i] 不等于 s[i] i == index。因此,为什么我完全删除了第 2 和第 3 循环并将那些 returns 直接合并到第 1 循环中。
  • 有什么方法可以和你聊天吗?有些事情我想问。希望你不介意
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2021-11-07
相关资源
最近更新 更多