清除列表中元素的问题

时间:2011-07-01 05:43:37

标签: c++

struct ScheduleTaskInfo
{
unsigned int nTaskID;
   __time64_t timeStartTime;
__time64_t timeEndTime; 
};

typedef list<ScheduleTaskInfo> SchedulerList;   

SchedulerList::iterator itrSchedulerList;    
for(itrSchedulerList = gSchedulerList.begin();itrSchedulerList != gSchedulerList.end();itrSchedulerList++)
{
    SYSTEMTIME st;
    GetLocalTime(&st);

    CTime ctSyatemTime(st);

    if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
    {

        itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
    }

}

我正在这样做它正在崩溃for循环。我认为这是由于erase(); 我在这里做错了吗?请在此建议我

2 个答案:

答案 0 :(得分:6)

您应该在itrSchedulerList++中将else-block写为:

for(itrSchedulerList = gSchedulerList.begin();
                     itrSchedulerList !=gSchedulerList.end();)
{
    SYSTEMTIME st;
    GetLocalTime(&st);

    CTime ctSyatemTime(st);

    if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
    {

        itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
    }
    else
        itrSchedulerList++;
}

这可确保您不会将其增加到列表的末尾。 erase()可能会返回结束迭代器,它将在您的版本的for循环中递增。

答案 1 :(得分:2)

当你将迭代器重新分配给erase的返回时,你不应该增加迭代器,因为你将有效地跳过一个元素。把它放在一个额外的else块中:

if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
{

    itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
}
else
{
  ++itrSchedulerList;
}

将其从for-loop中取出。