如果我想按字典顺序比较两个向量,我可以这样做:
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<[...]>
那么,如何做才能做到这一点呢?
我需要这个是因为,我创建了一个自定义的大整数类,在这个类中,我是按照小端顺序存储节点的,现在,要比较两个整数是否相等,首先我比较它们的大小,然后我需要比较大小相等的向量,按照字典顺序的反向视图。
2条答案
按热度按时间uujelgoq1#
std::views::reverse
等没有定义operator<
,但是在标准库中有一个普通算法作为它的普通函数模板:具有迭代器接口的std::lexicographical_compare
和具有范围接口的std::ranges::lexicographical_compare
。jq6vz3qz2#
正如@user17732522所说,你可以使用
std::lexicographical_compare
和std::views::reverse
,但是如果你想使用c++11,你可以简单地使用reverse iterators
和std::lexicographical_compare
。