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

如何在C++中对两个vector进行逆序字典序比较?

如何对vector的逆视图进行字典序比较?

C++中对两个std::vector进行字典序比较可以直接使用operator<,示例如下:

int main() {
    std::vector<int> a{0, 7, 8, 9};
    std::vector<int> b{1, 2, 3, 4};

    std::cout << std::boolalpha;
    std::cout << "a < b returns " << (a < b) << '\n';
}

但尝试对vector的逆视图(通过std::views::reverse生成)直接使用operator<会编译失败,示例代码:

int main() {
    std::vector<int> a{3, 2, 1};
    std::vector<int> b{9, 8, 7, 6};

    std::cout << std::boolalpha;
    std::cout << "reverse a < reverse b returns " << ((a | std::views::reverse) < (b | std::views::reverse)) << '\n';
}

编译错误信息:

<source>:23:81: error: no match for 'operator<' (operand types are 'std::ranges::reverse_view<std::ranges::ref_view<std::vector<int> > >' and 'std::ranges::reverse_view<std::ranges::ref_view<std::vector<int> > >')
   23 |     std::cout << "reverse a < reverse b returns " << ((a | std::views::reverse) < (b | std::views::reverse)) << '\n';
      |                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                                          |                           |
      |                                                          reverse_view<[...]>         reverse_view<[...]>

解决方案

方法1:使用std::ranges::lexicographical_compare

C++20的Ranges库提供了std::ranges::lexicographical_compare函数,专门用于比较两个范围的字典序,支持所有符合范围概念的类型(包括reverse_view)。

修改后的代码如下:

#include <vector>
#include <iostream>
#include <ranges>
#include <algorithm>

int main() {
    std::vector<int> a{3, 2, 1};
    std::vector<int> b{9, 8, 7, 6};

    std::cout << std::boolalpha;
    auto rev_a = a | std::views::reverse;
    auto rev_b = b | std::views::reverse;
    bool result = std::ranges::lexicographical_compare(rev_a, rev_b);
    std::cout << "reverse a < reverse b returns " << result << '\n';
}

该函数会按字典序逐个比较两个范围中的元素,遇到第一个不相等的元素时返回结果;若一个范围是另一个的前缀,则较短的范围被判定为更小,完全匹配你开发大整数类的需求——小端存储的vector逆序后即为高位在前的数字,字典序比较等价于数值大小比较。

方法2:在自定义大整数类中封装比较逻辑

针对你开发自定义大整数类的场景,可以在类的operator<中直接调用std::ranges::lexicographical_compare来比较内部vector的逆视图:

#include <vector>
#include <ranges>
#include <algorithm>

class BigInt {
private:
    std::vector<int> digits; // 小端存储,digits[0]是最低位
public:
    BigInt(std::vector<int> d) : digits(std::move(d)) {}

    bool operator<(const BigInt& other) const {
        auto rev_this = digits | std::views::reverse;
        auto rev_other = other.digits | std::views::reverse;
        return std::ranges::lexicographical_compare(rev_this, rev_other);
    }
};

这样在比较两个BigInt对象时,会自动按逆序字典序(即数值大小)进行比较。

内容的提问来源于stack exchange,提问作者Sourav Kannantha B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:01:56