如何解决试图将一个 if-elseif 组转换为一组三元组获取“操作数类型不兼容“Node *”和“int”C/C++(42)”
所以,为了让我的代码更快,我希望将我的 if 语句转换为三元组,因为这是一个完美的地方。这是因为三元语句比 if 语句更快,因为它是无分支的。由于这条线的运行频率,我想对其进行优化。 原函数:
void Union(Node nodes[],Node &n,Node &u)
{
Node& nRoot = findRoot(nodes,n.val);
Node& uRoot = findRoot(nodes,u.val);
int nRootRank = nodes[nRoot.val.second].rank;
int uRootRank = nodes[uRoot.val.second].rank;
if (nRootRank < uRootRank) nodes[nRoot.val.second].parent = &uRoot;
else if (nRootRank > uRootRank) nodes[uRoot.val.second].parent = &nRoot;
else if (std::rand() % 2)
{
nodes[nRoot.val.second].parent = &uRoot;
uRoot.rank++;
}
else
{
nodes[uRoot.val.second].parent = &nRoot;
nRoot.rank++;
}
}
和无分支版本:
void Union(Node nodes[],u.val);
int nRootRank = nodes[nRoot.val.second].rank;
int uRootRank = nodes[uRoot.val.second].rank;
(nRootRank < uRootRank) ? nodes[nRoot.val.second].parent = &uRoot :
(
(nRootRank > uRootRank) ? nodes[uRoot.val.second].parent = &nRoot :
(
(std::rand() % 2) ? (nodes[nRoot.val.second].parent = &uRoot,uRoot.rank++) :
(
(nodes[uRoot.val.second].parent = &nRoot,nRoot.rank++)
)
)
);
}
我遇到的问题是 '(nRootRank > uRootRank) 中的冒号? node[uRoot.val.second].parent = &nRoot : ' 表示“操作数类型不兼容(“Node *”和“int”)C/C++(42)”尽管从我所见,三元不应该有任何问题。任何想法为什么它会给出该消息?不,对于那些直接进入“如果比三元更好”的人来说,不是,除非在少数情况下将优化版本硬编码到 C++ 中。如果您想了解原因,请查看无银行编程。
解决方法
每个人都非常正确地指出三元语句是分支语句。然而,与此同时,为了回答你的实际问题,你的第一个三元赋值给了 .parent
,最后一个三元返回了 .rank++
的结果,也就是说,实际上,赋值了一个 int
到 Node *
。
我有点想知道固定版本是否更快,但我敢打赌它不是。唯一的原因可能是优化器失败,但我见过更奇怪的......
,由@1201ProgramAlarm 解决 ” 如果您小心,您可以设置不同的值类型。反转逗号运算符中的操作。首先递增,然后最后对 parent 进行赋值,以便逗号运算符为所有表达式返回相同的类型。 "
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。