我有一个类型为finalwords的对象。 在其中,有两个布尔变量,
bool isPopular;
bool isFirstSearch;
我正在尝试根据这些属性对最终字词的向量进行排序,但是我遇到了涉及多个属性的排序问题。
我想要一个按以下顺序排序的列表:
isPopular=true, isFirstSearch = true
isPopular=true, isFirstSearch = false
isPopular=false, isFirstSearch = true
isPopular=false, isFirstSearch = false
换句话说,
流行(1)和firstsearch(1)首先,
接着是热门(1)和firstsearch(0),
接着是热门(0)和第一次搜索(1),
最后流行(0)和firstsearch(0)
void sortResults (vector <finalwords> &finalSuggestions)
{
sort (finalSuggestions.begin(), finalSuggestions.end(), [] (finalwords x, finalwords y)
{
return ((x.isFirstSearch > y.isFirstSearch) && (x.isPopular > y.isPopular)) ;
});
}
我知道它不完整,但即便如此,我也很受欢迎。首先在向量的中间/末尾搜索单词。我在比较中向后工作时遇到问题,无法获得所需的向量顺序
答案 0 :(得分:2)
您的比较功能不正确,因为它没有按排序要求实现strict weak ordering。它应该写成:
[] (finalwords const & x, finalwords const & y) //use const &
{
if ( x.isPopular!= y.isPopular)
return x.isPopular;
else
return x.isFirstSearch;
}
基本上说,如果x.isFirstSearch
和y.isFirstSearch
不相等,则返回x.isFirstSearch
,因为如果x.isFirstSearch
是true
(这意味着另一个是false
{1}})。然后x
必须在y
之前,或者x.isFirstSearch
是false
(这意味着其他是true
),x
必须在y
之后1}}。 else
阻止同样的原因。
详细了解严格弱排序:
What is meaning of strict weak ordering in layman's term?
请注意std::tuple
实现了严格的弱排序,所以你可以这样写:
[] (finalwords const & x, finalwords const & y) //use const &
{
return std::make_tuple(x.isPopular, x.isFirstSearch) < std::make_tuple(y.isPopular, y.isFirstSearch);
}
这也是同样的工作。
希望有所帮助。
答案 1 :(得分:2)
试试这个:
[] (const finalwords& x, const finalwords& y)
{
if (x.isPopular != y.isPopular) return x.isPopular;
else if (x.isFirstSearch != y.isFirstSearch) return x.isFirstSearch;
else return false;
}
答案 2 :(得分:1)
它可以说有点神秘 - 因为它利用从bool
到0
或1
的隐式转换 - 但仅仅是为了列出另一个替代方案的乐趣:
return lhs.isPopular * -2 - lhs.isFirstSearch <
rhs.isPopular * -2 - lhs.isFirstSearch;
这基本上是对字段赋予权重,并对这些字段进行求和以得到对象的权重:它们在排序中较早获得true
值为负,而isPopular
已加倍“权重“isFirstSearch
所以它是”主要“排序字段。这恰好可以避免分支,因此可能与if
/ else
或?
/ :
执行不同(可能更好) - 使用替代方案,尽管这不太可能经常发生