【问题标题】:Using std::sort with a raw array of pointers? [closed]将 std::sort 与原始指针数组一起使用? [关闭]
【发布时间】:2019-04-25 20:30:22
【问题描述】:

假设您有一些较旧的代码和数据结构:

struct TEST
{
   int a;
   int b;
};

TEST *items[9]; // Points to an array of TEST*

现在我想对这些对象进行排序。旧代码使用 QSort,但我想使用 std::sort。这会是什么样子?

我尝试了类似的方法:

typedef std::function<bool(const TEST *, const TEST*)> TestCompareType;
TEST **items;
std::sort(items, items+size, 
    [](const TEST *p1, const TEST *p2) 
    {
        if(p1->a == p2->a)
        {
            return p1->b < p2->b;
        }
        else 
        { 
            // Ooops! Forgot to put "return here"
            p1->a < p2->a;

            // This would fix it
            // return p1->a < p2->a;
        }
    });

但我收到一个提示“表达式:无效比较器”的崩溃

有什么想法吗?

更新:我完全认为错误与使用带有指针数组的 std::sort 有关。我用更接近我所拥有的代码替换了示例代码。发现我有一个错字。在比较器的所有情况下,我都没有返回。

【问题讨论】:

  • 但我得到一个崩溃,说比较功能不好。确切的错误信息是什么? (另外我希望您的实际应用程序中有更多代码,因为items 没有初始化。请制作一个MVCE
  • 请编辑您的问题以包含minimal reproducible example
  • typedef 不需要且未使用。
  • 您的std::sort 行似乎正确(假设指针不是nullptritemssize 已正确初始化)。
  • 我的蜘蛛侠感觉刺痛并告诉我,您使用的实际排序 lambda 不起作用(并且尚未发布),尝试对 进行排序b 但不能完美地使用严格的弱排序。但这显然是一个猜测,因为您还没有向我们展示 MCVE。

标签: c++ lambda


【解决方案1】:

当你使用

struct
{
   int a;
   int b;
} TEST;

您将TEST 定义为匿名struct 类型的变量。

然后你继续使用TEST,就好像它是一个类型一样。

TEST **items;

更改TEST 的定义,使其成为一个类型。

struct TEST
{
   int a;
   int b;
};

这是一个成功构建但没有做任何有用的演示程序。

#include <algorithm>
#include <cstddef>

struct TEST
{
   int a;
   int b;
};

void sortStuff(TEST** items, size_t size)
{
   std::sort(items, items+size,
             [](const TEST *p1, const TEST *p2) { return p1->a < p2->a; });
}

int main() {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多