我想根据节点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;
}
答案 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
函数。