微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

试图将一个 if-elseif 组转换为一组三元组获取“操作数类型不兼容“Node *”和“int”C/C++(42)”

如何解决试图将一个 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++ 的结果,也就是说,实际上,赋值了一个 intNode *

有点想知道固定版本是否更快,但我敢打赌它不是。唯一的原因可能是优化器失败,但我见过更奇怪的......

,

由@1201ProgramAlarm 解决 ” 如果您小心,您可以设置不同的值类型。反转逗号运算符中的操作。首先递增,然后最后对 parent 进行赋值,以便逗号运算符为所有表达式返回相同的类型。 "

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。