对包含struct

时间:2015-06-26 09:19:04

标签: c++ deque

我想根据节点struct中包含的int g值对deque进行排序。 我的程序结构如下:

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;
}

3 个答案:

答案 0 :(得分:7)

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;
});

答案 1 :(得分:1)

您可以使用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;

答案 2 :(得分:0)

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

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

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

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