如何在C++中重载<运算符比较存储数字的int列表?
重载
<运算符比较存储数字各位的std::list 咱们先梳理下你代码里的几个关键问题,再一步步实现正确的逻辑:
你的代码里的核心问题
- 迭代器初始化错误:
begin是容器的成员函数,必须加括号调用(begin());而且因为你的operator<是const成员函数,只能使用const_iterator(或者直接用cbegin()/cend()),否则会触发编译错误。 - 逻辑顺序错误:你判断完长度后直接
return,导致长度相等时的逐位比较代码完全不会执行,这是严重的逻辑漏洞。 - 迭代器比较错误:直接比较
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
相关产品推荐
相关产品推荐

