Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;std::按属性对对象向量排序_C++_Sorting - Fatal编程技术网

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

C++ c++;std::按属性对对象向量排序,c++,sorting,C++,Sorting,我有一个finalwords类型的对象。 其中有两个布尔变量 bool isPopular; bool isFirstSearch; 我正试图根据这些属性对最终单词向量进行排序,但在涉及多个属性的情况下排序时遇到困难 我想要一个按以下顺序排序的列表: isPopular=true, isFirstSearch = true isPopular=true, isFirstSearch = false isPopular=false, isFirstSearch = true isPopular=

我有一个finalwords类型的对象。 其中有两个布尔变量

bool isPopular;
bool isFirstSearch;
我正试图根据这些属性对最终单词向量进行排序,但在涉及多个属性的情况下排序时遇到困难

我想要一个按以下顺序排序的列表:

isPopular=true, isFirstSearch = true
isPopular=true, isFirstSearch = false
isPopular=false, isFirstSearch = true
isPopular=false, isFirstSearch = false
换句话说,

流行(1)和第一搜索(1)优先

其次是popular(1)和firstsearch(0)

然后是popular(0)和firstsearch(1)

最后是热门搜索(0)和firstsearch(0)

void排序结果(向量和最终建议)
{
排序(finalSuggestions.begin(),finalSuggestions.end(),[](finalwords x,finalwords y)
{
返回((x.isFirstSearch>y.isFirstSearch)和&(x.isPopular>y.isPopular));
});
}

我知道它不完整,但即使这样,我还是在向量的中间/末端有流行的&firstsearch单词。我在比较过程中遇到了问题,无法获得所需的向量顺序。您的比较函数不正确,因为它没有按照排序的要求实现。应写为:

[] (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
)。然后
x
必须在
y
之前,或者如果
x.isFirstSearch
false
(这意味着另一个是
true
),则
x
必须在
y
之后。
else
块的推理也是一样的

了解有关严格弱排序的更多信息:

请注意,
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);
}
[](finalwords const&x,finalwords const&y)//使用const&
{
返回std::make_tuple(x.isPopular,x.isFirstSearch)
这也起到了同样的作用


希望有帮助。

您的比较函数不正确,因为它没有按照排序的要求实现。应写为:

[] (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
)。然后
x
必须在
y
之前,或者如果
x.isFirstSearch
false
(这意味着另一个是
true
),则
x
必须在
y
之后。
else
块的推理也是一样的

了解有关严格弱排序的更多信息:

请注意,
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);
}
[](finalwords const&x,finalwords const&y)//使用const&
{
返回std::make_tuple(x.isPopular,x.isFirstSearch)
这也起到了同样的作用

希望能有所帮助。

试试这个:

[] (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;
}
试试这个:

[] (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;
}

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

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

这基本上是给字段赋予权重,并对这些字段求和以获得对象的权重:它们为负值以在排序的早期获得
true
值,而
isPopular
的“权重”是
isFirstSearch
的两倍,因此它是“主要”排序字段。这恰好也避免了分支,因此如果使用替代方案,则可能会比
的执行方式不同(可能更好),虽然这不太重要。

它可以说有点神秘——因为它利用了从
bool
0
1
的隐式转换——但只是为了列出另一种选择:

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

这基本上是给字段赋予权重,并对这些字段求和以获得对象的权重:它们为负值以在排序的早期获得
true
值,而
isPopular
的“权重”是
isFirstSearch
的两倍,因此它是“主要”排序字段。这恰好也避免了分支,因此如果
/
其他
/
-使用替代方案,可能会表现得不同(可能更好),尽管这不太重要。

在我仍沉浸于如何工作的过程中,我会指出它正在翻转上述条件2和条件3。这种排序有#1、#3、#2、#4我知道
isFirstSearch
isPopular
都是布尔值。。。但是为了让程序员阅读代码,我们能不能保持显式的小于比较:@filposs:如果你想先比较
isPopular
,那就先比较(再次查看我的答案)。至于它是如何工作的,试着使用几对值,然后在你的脑海中运行这段代码。当我仍沉浸在这段代码的工作原理中时,我将指出它正在翻转上面的条件2和条件3。这种排序有#1、#3、#2、#4我知道
isFirstSearch
isPopular
都是布尔值。。。但是为了让程序员阅读代码,我们能不能保持显式的小于比较:@filposs:如果你想先比较
isPopular
,那就先比较(再次查看我的答案)。至于它是如何工作的,请尝试使用几对值,然后在您的脑海中运行此代码。现在可以工作了,这是您从未想到过的!=比较!谢谢,+1表示第二个条件
else,如果(x.isFirstSearch!=y.isFirstSearch)
不是真的需要。你可以