Сортировать деку, содержащую структуру
Я хочу отсортировать deque согласно значению 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;
}
3 ответа
В своем коде вы выходите за пределы, когда j
повторяется до size - 1
что приводит к j+1
быть равным size
который находится за пределами.
Ты можешь использовать std::sort
которая является встроенной функцией C++.
Синтаксис std::sort(t.begin(), t.end())
где t
это объект, который вы хотите отсортировать.
Поскольку вы используете структуру, вам придется определить порядок, то есть, как меньше и равно вычисленному. Вы можете либо перегрузить встроенные операторы, либо определить новую функцию и передать ее в качестве третьего параметра sort
функция.
Вы выходите за пределы, когда 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;
});
Ты можешь использовать 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;