Сортировать деку, содержащую структуру

Я хочу отсортировать 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;
Другие вопросы по тегам