c ++ std ::按属性排序对象的向量

时间:2015-04-20 03:13:45

标签: c++ sorting

我有一个类型为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)) ;
  });
}

我知道它不完整,但即便如此,我也很受欢迎。首先在向量的中间/末尾搜索单词。我在比较中向后工作时遇到问题,无法获得所需的向量顺序

3 个答案:

答案 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.isFirstSearchy.isFirstSearch不相等,则返回x.isFirstSearch,因为如果x.isFirstSearchtrue(这意味着另一个是false {1}})。然后x必须在y之前,或者x.isFirstSearchfalse(这意味着其他是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;
}

DEMO

答案 2 :(得分:1)

它可以说有点神秘 - 因为它利用从bool01的隐式转换 - 但仅仅是为了列出另一个替代方案的乐趣:

return lhs.isPopular * -2 - lhs.isFirstSearch <
       rhs.isPopular * -2 - lhs.isFirstSearch;

这基本上是对字段赋予权重,并对这些字段进行求和以得到对象的权重:它们在排序中较早获得true值为负,而isPopular已加倍“权重“isFirstSearch所以它是”主要“排序字段。这恰好可以避免分支,因此可能与if / else? / :执行不同(可能更好) - 使用替代方案,尽管这不太可能经常发生