【问题标题】:Lambda expression for comparing multiple fields using C++ sort用于使用 C++ 排序比较多个字段的 Lambda 表达式
【发布时间】:2021-05-06 04:13:42
【问题描述】:

我想对一个向量进行排序,它的元素是一个包含三个字段的对象。

我可以通过以下代码比较一个字段,

    std::sort(std::execution::par, pidx.begin(), pidx.end(), [&P](int i, int j) { 
        return P[i].obj[0]<P[j].obj[0];
        }
    );

但是在比较多个字段时,它会因运行时错误而失败。


    std::sort(std::execution::par, pidx.begin(), pidx.end(), [&P](int i, int j) {
        for (int k = 0; k < 3; k++)
            if (P[i].obj[k] < P[j].obj[k])
                return true;
        return false;
        }
    );

运行时错误如下,

调试断言失败!

文件 C:\Program Files(x86)\Microsoft Visual Studio2019\Community\VC\Tools\MSVC\14.28.22910\inclue\xutility

行:1626

表达式:无效的比较器

有关您的程序如何导致断言失败的信息,请参阅关于断言的可视 C++ 文档。

感谢您的帮助。

【问题讨论】:

  • 什么是P?什么是例如P[i]? P[i].obj 是什么?请尝试创建minimal reproducible example 向我们展示。
  • 抱歉信息不清楚。 P 是对象的向量。 P[i] 和 P[j] 是 P 的两个元素。pidx 是另一个整数向量,它存储了 P 元素的索引。

标签: c++ sorting lambda compare


【解决方案1】:

我找到了解决办法,比较lambda函数不正确。


    std::sort(std::execution::par, pidx.begin(), pidx.end(), [&P](int i, int j) {
        for (int k = 0; k < 3; k++)
            if (P[i].obj[k] != P[j].obj[k])
                return P[i].obj[k] < P[j].obj[k];
        return false;
        }
    );

【讨论】:

  • return P[i].obj &lt; P[j].obj; 可能就够了。
  • 感谢您的建议。在我的例子中,obj(s) 存储在一个纯数组中而不是向量中,所以我必须按顺序比较它们。我会在以后的节目中试试你的方法。
  • 你可以使用std::array而不是C-array,或者使用std::lexicographical_compare
猜你喜欢
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多