Sou*_*a B 2 c++ vector comparison-operators lexicographic-ordering std-ranges
如果我想按字典顺序比较两个向量,我可以这样做:
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';
}
Run Code Online (Sandbox Code Playgroud)
但是以相反的顺序执行相同的操作无法编译:
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';
}
Run Code Online (Sandbox Code Playgroud)
后一个代码失败并显示:
<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<[...]>
Run Code Online (Sandbox Code Playgroud)
那么,如何正确实现这一目标呢?
我需要这个,因为我正在创建一个自定义大整数类。其中,我以小端顺序存储节点。现在,为了比较两个整数是否相等,我首先比较它们的大小。然后我需要按反向视图的字典顺序比较相同大小的向量。
operator<
没有为std::views::reverse
其他人定义。然而,标准库中有一个普通的算法作为它的普通函数模板: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';
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
348 次 |
最近记录: |