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