Если я хочу сравнить два вектора в лексикографическом порядке, я могу сделать следующее:
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<[...]>
Итак, как добиться этого правильно?
Мне это было нужно, потому что я создавал собственный большой целочисленный класс. В этом я хранил узлы в порядке с прямым порядком байтов. Теперь, чтобы сравнить, равны ли два целых числа, я сначала сравниваю их размеры. Затем мне нужно было бы сравнить векторы одинакового размера в лексикографическом порядке их обратного вида.
Работает ли a<b для векторов, я так не думаю!
@kiner_shah да
Отвечает ли это на ваш вопрос? Есть ли стандартный способ сравнения двух диапазонов в C++?
@kiner_shah OP хочет сравнить перевернутые векторы через <, вопрос, который вы предлагаете как обман, касается равенства, где перевернутое или нет, не имеет значения
@463035818_is_not_a_number, посмотрите на этот ответ по этой ссылке: stackoverflow.com/a/5405898/4688321
@kiner_shah тот факт, что есть ответ, который немного связан, не делает вопросы дубликатами. Учтите, что ответ, на который вы ссылаетесь, может быть удален или изменен, чтобы он по-прежнему соответствовал заданному там вопросу, но не соответствовал заданному здесь вопросу. Этот вопрос касается сравнения на равенство, этот вопрос касается сравнения < в обратном порядке.
@463035818_is_not_a_number, то есть вы хотите сказать, что < это не сравнение? Кроме того, на той же странице есть еще один ответ stackoverflow.com/a/67734453/4688321, который еще лучше. Если вы посмотрите на заголовок вопроса, в нем говорится о сравнении двух диапазонов. Теперь, если ответы там конкретно сосредоточены на равенстве, несмотря на то, что вопрос конкретно не спрашивает о равенстве, это не моя вина!
@kiner_shah я имею в виду, что ==/равенство и лексикографическое сравнение/ < совершенно разные. Вопрос, который вы связываете, касается первого, вопрос здесь касается второго. Ответы на вопрос, на который вы ссылаетесь, сосредоточены на равенстве, потому что это то, о чем просят там, но не здесь.
@kiner_shah вопрос, на который вы ссылаетесь, не дает полной ясности, но из кода видно, что они ожидают, что функция вернет true для двух равных диапазонов.
@ 463035818_is_not_a_number, хорошо, согласен, это косвенно говорит о равенстве.
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';
Для дальнейшего использования я использую это решение с небольшими изменениями, как показано на этом.
#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';
}
Я могу использовать std::reverse. Но это мутирует вектор, что нежелательно.