Я могу получить объекты из списка и скопировать их, но как мне удалить скопированные объекты? - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь найти все процессы в списке заблокированных процессов с указанным номером события, скопировать их в TransferList, а затем удалить их.Копирование и перемещение объектов Process работает нормально, но я не могу понять, как впоследствии удалить эти объекты Process из заблокированного Process.

ProcessQueue findEventFlag(int eventnum)
{
    ProcessQueue transferProcess;
    Process process;
    list<Process>::iterator it;



    for (it = blockedProcess.begin(); it != blockedProcess.end(); it++)
    {
        process = *it;

        if (process.getEvent() == eventnum)
        {
            process.setState("READY");
            process.setEvent(-1);
            transferProcess.enqueue(process);
        }

    }

    return transferProcess;

}

1 Ответ

0 голосов
/ 04 октября 2018

Опираясь на комментарии, попробуйте это (что основывается на том факте, что std::list::erase удобно возвращает итератор для следующего элемента в списке):

ProcessQueue findEventFlag(int eventnum)
{
    ProcessQueue transferProcess;
    Process process;
    list<Process>::iterator it = blockedProcess.begin();

    while (it != blockedProcess.end())
    {
        process = *it;

        if (process.getEvent() == eventnum)
        {
            process.setState("READY");
            process.setEvent(-1);
            transferProcess.enqueue(process);
            it = process.Erase (it);
        }
        else
            it++;
    }

    return transferProcess;
}

Вы также можете передать элемент из одного списка в другой с std::list::splice, который позволит избежать копирования вашего process объекта и, следовательно, может быть более эффективным, например:

ProcessQueue findEventFlag(int eventnum)
{
    ProcessQueue transferProcess;
    Process process;
    list<Process>::iterator it = blockedProcess.begin();

    while (it != blockedProcess.end())
    {
        process = *it;
        list<Process>::iterator next = std::next (it);

        if (process.getEvent() == eventnum)
        {
            process.setState("READY");
            process.setEvent(-1);
            transferProcess.splice(transferProcess.begin (), blockedProcess, it);
        }

        it = next;
    }

    return transferProcess;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...