Быстрый способ сделать лексикографическое сравнение 2 чисел

Я пытаюсь отсортировать вектор без знака int в лексикографическом порядке.

Функция std :: lexicographic_compare поддерживает только итераторы, поэтому я не уверен, как сравнивать два числа.

Вот код, который я пытаюсь использовать:

std::sort(myVector->begin(),myVector->end(), [](const unsigned int& x, const unsigned int& y){
std::vector<unsigned int> tmp1(x);
std::vector<unsigned int> tmp2(y);
return lexicographical_compare(tmp1.begin(),tmp1.end(),tmp2.begin(),tmp2.end());
} );

2

Решение

C ++ 11 вводит std::to_string

Вы можете использовать от to_string как показано ниже:

std::sort(myVector->begin(),myVector->end(), [](const unsigned int& x, const unsigned int& y){
std::string tmp1 = std::to_string(x);
std::string tmp2 = std::to_string(y);
return lexicographical_compare(tmp1.begin(),tmp1.end(),tmp2.begin(),tmp2.end());
} );
3

Другие решения

Я предполагаю, что у вас есть веские причины, но позвольте мне спросить: почему вы сортируете два типа int, используя порядок std :: lexicographic? Например, в каком сценарии 0 не меньше 1?

Я предлагаю для сравнения скаляров, которые вы хотите использовать std :: less. То же, что и сама библиотека std.

Ваш код (из вопроса) может содержать лямбду, которая будет использовать std :: less и которая будет работать отлично. Но давайте сделаем еще один шаг и предоставим некоторый повторно используемый код, готовый для вставки в ваш код. Вот один пример:

 /// sort a range in place
template< typename T>
inline void dbj_sort( T & range_ )
{
// the type of elements range contains
using ET = typename T::value_type;
// use of the std::less type
using LT = std::less<ET>;
// make its instance whose 'operator ()'
// we will use
LT less{};

std::sort(
range_.begin(),
range_.end(),
[&]( const ET & a, const ET & b) {
return less(a, b);
});
}

Выше используется std :: less<> внутренне. И он будет сортировать все, что имеет begin () и end () и открытый тип элементов, которые он содержит. Другими словами, реализация концепции ассортимента.

Пример использования:

std::vector<int> iv_ = { 13, 42, 2 };
dbj_sort(iv_);

std::array<int,3> ia_ = { 13, 42, 2 };
dbj_sort(ia_);

std :: generics в действии …

Почему STD :: менее работает здесь? Среди других очевидных вещей, потому что он сравнивает два скаляра. std :: lexicographic_compare сравнивает два ординала.

std :: lexicographic_compare может использоваться для сравнения двух векторов, а не двух элементов из одного вектора, содержащего скаляры.

НТН

0

По вопросам рекламы [email protected]