моя функция сортировки списка общих указателей в c ++ не завершает сортировку - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть STL std::list из 5 общих указателей, которые указывают на объекты узлов, которые необходимо отсортировать по их соответствующим id номерам.

do
{
    check = 0, i = 0;
    auto it = newList.begin();

    while (i < newList.size() - 1)
    {
        first = *it;
        second = *++it;

        if (comp_id(first, second))
        {
            temp = second;
            second = first;
            first = temp;
            check = 1;
        }

        i++;
    }
} while (check == 1);

В этом коде comp_id() возвращает значение true и проходит через организацию, но в list ничего не меняется, пока это происходит. Я надеялся получить некоторое представление о том, почему это происходит, и как это исправить.

P.S. Мне не разрешено использовать метод list_name.sort(): (

1 Ответ

0 голосов
/ 27 апреля 2018

Причина, по которой это не работает, заключается в том, что вы вносите изменения только в локальные переменные (first и second), которые копируют значений из списка. Вы вообще не изменяете фактическое содержимое списка.

Чтобы код работал, просто измените переменные first и second на итераторы списка, а затем разыменуйте их, когда вы захотите получить доступ к их значениям, например:

auto size = newList.size();
if (size > 1)
{
    --size;
    do
    {
        check = 0, i = 0;
        auto it = newList.begin();

        while (i < size)
        {
            auto first = it;
            auto second = ++it;

            if (comp_id(*first, *second))
            {
                auto temp = *second;
                *second = *first;
                *first = temp;
                check = 1;
            }

            ++i;
        }
    }
    while (check == 1);
}

В этом отношении i также можно заменить итератором:

if (newList.size() > 1)
{
    auto begin = newList.begin();
    auto end = newList.end()-1;
    do
    {
        check = 0;
        auto it = begin;

        while (it != end)
        {
            auto first = it;
            auto second = ++it;

            if (comp_id(*first, *second))
            {
                auto temp = *second;
                *second = *first;
                *first = temp;
                check = 1;
            }
        }
    }
    while (check == 1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...