快速方法做词典比较2个数字

时间:2016-10-25 06:03:40

标签: c++ c++14 lexicographic

我正在尝试按字典顺序对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());
} );

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我假设你有一些很好的理由,但请允许我问:你为什么要使用std :: lexicographical命令对两个int进行排序?在哪种情况下0不小于1,例如?

我建议比较你想要使用std :: less的标量。与std lib本身相同。

您的代码(来自问题)可能包含一个将使用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&lt;&gt;内部。它将对包含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 in action ...

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

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

HTH