Как лексикографически сравнить два вектора в обратном порядке?

Если я хочу сравнить два вектора в лексикографическом порядке, я могу сделать следующее:

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<[...]>

Итак, как добиться этого правильно?

Мне это было нужно, потому что я создавал собственный большой целочисленный класс. В этом я хранил узлы в порядке с прямым порядком байтов. Теперь, чтобы сравнить, равны ли два целых числа, я сначала сравниваю их размеры. Затем мне нужно было бы сравнить векторы одинакового размера в лексикографическом порядке их обратного вида.

Я могу использовать std::reverse. Но это мутирует вектор, что нежелательно.

Sourav Kannantha B 17.02.2023 08:56

Работает ли a<b для векторов, я так не думаю!

kiner_shah 17.02.2023 08:57

@kiner_shah да

463035818_is_not_a_number 17.02.2023 08:57

Отвечает ли это на ваш вопрос? Есть ли стандартный способ сравнения двух диапазонов в C++?

kiner_shah 17.02.2023 09:02

@kiner_shah OP хочет сравнить перевернутые векторы через <, вопрос, который вы предлагаете как обман, касается равенства, где перевернутое или нет, не имеет значения

463035818_is_not_a_number 17.02.2023 09:06

@463035818_is_not_a_number, посмотрите на этот ответ по этой ссылке: stackoverflow.com/a/5405898/4688321

kiner_shah 17.02.2023 09:07

@kiner_shah тот факт, что есть ответ, который немного связан, не делает вопросы дубликатами. Учтите, что ответ, на который вы ссылаетесь, может быть удален или изменен, чтобы он по-прежнему соответствовал заданному там вопросу, но не соответствовал заданному здесь вопросу. Этот вопрос касается сравнения на равенство, этот вопрос касается сравнения < в обратном порядке.

463035818_is_not_a_number 17.02.2023 09:09

@463035818_is_not_a_number, то есть вы хотите сказать, что < это не сравнение? Кроме того, на той же странице есть еще один ответ stackoverflow.com/a/67734453/4688321, который еще лучше. Если вы посмотрите на заголовок вопроса, в нем говорится о сравнении двух диапазонов. Теперь, если ответы там конкретно сосредоточены на равенстве, несмотря на то, что вопрос конкретно не спрашивает о равенстве, это не моя вина!

kiner_shah 17.02.2023 09:12

@kiner_shah я имею в виду, что ==/равенство и лексикографическое сравнение/ < совершенно разные. Вопрос, который вы связываете, касается первого, вопрос здесь касается второго. Ответы на вопрос, на который вы ссылаетесь, сосредоточены на равенстве, потому что это то, о чем просят там, но не здесь.

463035818_is_not_a_number 17.02.2023 09:14

@kiner_shah вопрос, на который вы ссылаетесь, не дает полной ясности, но из кода видно, что они ожидают, что функция вернет true для двух равных диапазонов.

463035818_is_not_a_number 17.02.2023 09:17

@ 463035818_is_not_a_number, хорошо, согласен, это косвенно говорит о равенстве.

kiner_shah 17.02.2023 09:21
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
2
11
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Для дальнейшего использования я использую это решение с небольшими изменениями, как показано на этом.

Sourav Kannantha B 17.02.2023 19:12

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

Другие вопросы по теме