字典序比较 2 个数字的快速方法

Fast way to do lexicographical comparing 2 numbers

我正在尝试按字典顺序对 unsigned int 向量进行排序。

std::lexicographical_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());
} );

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());
} );

我假设您有一些充分的理由,但请允许我问:为什么要使用 std::lexicographical 顺序对两个 int 进行排序?比如在什么情况下0不小于1?

我建议比较您要使用的标量 std::less 。与标准库本身相同。

您的代码(来自问题)可能包含一个将使用 std::less 的 lambda,并且可以完美运行。但是,让我们更进一步,交付一些可重用的代码,以便粘贴到您的代码中。这是一个例子:

 /// 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() 以及 public 类型的元素进行排序。换句话说,范围概念的实现。

用法示例:

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

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

std:: 泛型在行动中...

为什么 std::less 在这里工作?在其他显而易见的事情中,因为它比较两个标量。 std::lexicographical_compare 比较两个序数。

std::lexicographical_compare 可能用于两个比较两个向量,而不是一个包含标量的向量中的两个元素。

HTH