You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中重载<运算符比较存储数字的int列表?

重载<运算符比较存储数字各位的std::list

咱们先梳理下你代码里的几个关键问题,再一步步实现正确的逻辑:


你的代码里的核心问题

  1. 迭代器初始化错误:begin是容器的成员函数,必须加括号调用(begin());而且因为你的operator<是const成员函数,只能使用const_iterator(或者直接用cbegin()/cend()),否则会触发编译错误。
  2. 逻辑顺序错误:你判断完长度后直接return,导致长度相等时的逐位比较代码完全不会执行,这是严重的逻辑漏洞。
  3. 迭代器比较错误:直接比较begin()返回的迭代器,比较的是迭代器的内存位置,不是元素的值!必须解引用迭代器(*it)来比较元素内容。

基础实现版本(手动逐位比较)

先写一个逻辑清晰的基础版本,帮你理解核心流程:

#include <list>

// 假设Digit是int的别名,根据你的实际定义调整
using Digit = int;

class Integer {
private:
    std::list<Digit> digits;
public:
    // 这里可以补充构造函数、其他成员方法...
    
    bool operator<(const Integer &rhs) const {
        // 第一步:长度短的数字肯定更小(比如123 < 4567)
        if (digits.size() != rhs.digits.size()) {
            return digits.size() < rhs.digits.size();
        }

        // 第二步:长度相等时,从前往后逐位比较
        auto lhs_it = digits.cbegin(); // const迭代器,符合const成员函数的要求
        auto rhs_it = rhs.digits.cbegin();

        while (lhs_it != digits.cend()) {
            if (*lhs_it != *rhs_it) {
                // 找到第一个不相等的位,直接比较值
                return *lhs_it < *rhs_it;
            }
            ++lhs_it;
            ++rhs_it;
        }

        // 所有位都相等,说明两个数字相等,返回false(lhs不小于rhs)
        return false;
    }
};

用std::mismatch简化代码

std::mismatch是<algorithm>头文件里的工具,它能帮我们快速找到两个容器中第一个不相等的元素对,让代码更简洁:

#include <list>
#include <algorithm> // 必须包含这个头文件才能用std::mismatch

using Digit = int;

class Integer {
private:
    std::list<Digit> digits;
public:
    // 构造函数等成员...
    
    bool operator<(const Integer &rhs) const {
        if (digits.size() != rhs.digits.size()) {
            return digits.size() < rhs.digits.size();
        }

        // 使用std::mismatch找到第一个不相等的元素对
        auto mismatch_pair = std::mismatch(
            digits.cbegin(), digits.cend(),
            rhs.digits.cbegin(), rhs.digits.cend()
        );

        // 如果所有元素都相等,返回false
        if (mismatch_pair.first == digits.cend()) {
            return false;
        }

        // 比较第一个不相等的元素值
        return *mismatch_pair.first < *mismatch_pair.second;
    }
};

补充说明:

  • 如果你的编译器是C++17及以上,可以用结构化绑定简化代码:
    auto [lhs_mismatch, rhs_mismatch] = std::mismatch(...);
    
  • std::mismatch返回的是一对迭代器,分别指向两个容器中第一个不相等的元素;如果所有元素都相等,两个迭代器都会指向容器的end位置。

内容的提问来源于stack exchange,提问作者wertewerfwe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:59:36