我可以从列表中获取对象并进行复制,但是如何删除复制的对象?

时间:2018-10-03 21:43:31

标签: c++ list

我试图在具有指定事件编号的blockedProcess列表中查找所有进程,将它们复制到transferList中,然后将其删除。复制和移动Process对象效果很好,但是我不知道以后如何从blockProcess中删除那些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 :(得分:0)

在注释的基础上,尝试以下操作(这取决于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;
}