c++ 如何按字典顺序比较两个相反顺序的向量?

omqzjyyz  于 2023-02-20  发布在  其他
关注(0)|答案(2)|浏览(100)

如果我想按字典顺序比较两个向量,我可以这样做:

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';
}

但是以相反的顺序执行相同的操作将无法编译:

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

    std::cout << std::boolalpha;
    std::cout << "revrese 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<[...]>

那么,如何做才能做到这一点呢?
我需要这个是因为,我创建了一个自定义的大整数类,在这个类中,我是按照小端顺序存储节点的,现在,要比较两个整数是否相等,首先我比较它们的大小,然后我需要比较大小相等的向量,按照字典顺序的反向视图。

uujelgoq

uujelgoq1#

std::views::reverse等没有定义operator<,但是在标准库中有一个普通算法作为它的普通函数模板:具有迭代器接口的std::lexicographical_compare和具有范围接口的std::ranges::lexicographical_compare

std::cout << "revrese a < reverse b returns "
          << std::ranges::lexicographical_compare(a | std::views::reverse, b | std::views::reverse) 
          << '\n';
jq6vz3qz

jq6vz3qz2#

正如@user17732522所说,你可以使用std::lexicographical_comparestd::views::reverse,但是如果你想使用c++11,你可以简单地使用reverse iteratorsstd::lexicographical_compare

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

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 "
            << std::lexicographical_compare(a.cbegin(), a.cend(), b.rbegin(),
                                            b.rend())
            << '\n';
}

相关问题