C++ C++;使用'排序;调整';比较函子
我有一个类函子(太复杂了,无法作为lambda实现),但为了简化这个概念,我想确保函子满足谓词。问题是,我希望所有大于C++ C++;使用'排序;调整';比较函子,c++,sorting,c++11,std,C++,Sorting,C++11,Std,我有一个类函子(太复杂了,无法作为lambda实现),但为了简化这个概念,我想确保函子满足谓词。问题是,我希望所有大于(1)的值都按升序排列,但将(1)的所有值都放在“末尾”-例如,视为“较大”值 e、 例如,{2,2,2,3,3,4,5,6,6,…,1,1,1} 函数对象被实现为一个结构,用于从构造它的(复杂的)对象引用中提取参数,但重要的部分是函数对象中的方法。要简化: bool operator () (unsigned i, unsigned j) { if (i == 1) r
(1)
的值都按升序排列,但将(1)
的所有值都放在“末尾”-例如,视为“较大”值
e、 例如,{2,2,2,3,3,4,5,6,6,…,1,1,1}
函数对象被实现为一个结构,用于从构造它的(复杂的)对象引用中提取参数,但重要的部分是函数对象中的方法。要简化:
bool operator () (unsigned i, unsigned j)
{
if (i == 1) return false; // (1 >= x)
if (j == 1) return true; // (x <= 1)
return (i < j);
}
bool运算符()(无符号i,无符号j)
{
如果(i==1)返回false;//(1>=x)
如果(j==1)返回true;//(x如果可以定义一个双射运算,其中比较是全序/弱序的,那么就可以了。
对于您的类型(unsigned
),这只是-=2
/+=2
bool operator()(unsigned i, unsigned j) const{
return (i-2) < (j-2); // usigned will wrap around 0
}
bool运算符()(无符号i,无符号j)常量{
return(i-2)<(j-2);//usigned将环绕0
}
这也取决于你想用零做什么
这取决于1-2==std::numeric_limits::max()
,因此当你将1
与x
进行“比较”时,你会得到std::numeric_limits::max()
,这是假的,即使x
也是1
(如果存在这样的话,0
也是真的).在我看来写得不错。只要把1
读成“无限”说服自己。@IgorTandetnik-这是一个非常有用的建议,因为我在比较之前明确地消除了I=1
和j=1
的情况。我不是100%确定的是compare
谓词的正式定义。嗯,我不确定如何帮助您确信您的谓词是正确的满足他们。@IgorTandetnik-是的。我已经试着根据这个链接写出一些布尔表,这让我基本上可以确定。我想我只是想问一些我可能错过的情况。这是一个启发——我相信,即使x=1
,条件仍然会按需要计算为false
。注意:这是我会把0
放在1
之前(原始帖子没有指明0
去哪里)@M.M.是的,OP在评论中说“没有零”。他后来删除了评论。这就是我为什么写“这也取决于你想用零做什么。”@M.M-很抱歉,删除注释是一个错误,但是@alfC对我之前的no(0)
值声明是正确的。