对包含结构的双端队列进行排序

Sort a deque containing struct

我想根据节点结构中包含的 int g 值对双端队列进行排序。 我的程序结构是这样的:

struct node
{
    int x;
    int y;
    int g;  
};

deque<node> open;

这是我正在尝试的排序函数,但它给出了垃圾值。请指导我:

deque<node> sort(deque<node> t)
{
    deque<node>::iterator it;
    int size= t.size();
    node te;
    for(int i=0; i<size; i++)
    {
        for(int j=0; j<size-i; j++)
        {
            if(t[j].g < t[j+1].g)
            {
                te.x = t[j].x;
                te.y = t[j].y;
                te.g = t[j].g;

                t[j].x = t[j+1].x;
                t[j].y = t[j+1].y;
                t[j].g = t[j+1].g;

                t[j+1].x = te.x;
                t[j+1].y = te.y;
                t[j+1].g = te.g;
            }
        }
    }

    for(it=t.begin();it!=t.end();it++)
    {   
        te = *it;
        cout<<te.x<<","<<te.y<<","<<te.g<<endl;
    }

    return t;
}

i == 0 时您将越界:您将 j 迭代到 size - 1 包含在内,然后 j + 1 == size.

无论如何,有更简单和更快的解决方案 - 只需使用 std::sort:

std::sort(t.begin(), t.end(), [](const node& a, const node& b) { 
    return a.g > b.g;
});

在您的代码中,当 j 迭代到 size - 1 时,您超出了范围,这导致 j+1 等于 size,这超出了范围。

您可以使用 std::sort,这是一个内置的 C++ 函数。

语法为 std::sort(t.begin(), t.end()),其中 t 是您要排序的对象。

由于您使用的是结构,因此您必须定义一个顺序,即如何计算小于和等于。您可以重载内置运算符,或定义一个新函数并将其作为第三个参数传递给 sort 函数。

您可以使用 std::sort

struct {
    bool operator()(node a, node b)
    {   
        return a.g < b.g;
    }   
} customLess;
std::sort(s.begin(), s.end(), customLess);

我通常会说:如果你想要排序的容器,你可能需要通过给定的 g 获取节点。使用 std::multimap 而不是 std::deque,这将允许您将 g 值映射到节点:

std::multimap<int, node> nodes;