擦除列表中的元素时出现问题

Problem in erasing element in list

本文关键字:问题 元素 列表 擦除      更新时间:2023-10-16
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);          
    }
}

我正在做这件事,它正在循环中崩溃。我认为这是由于擦除((;我在这里做错什么了吗??请向我推荐这个

您应该将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循环中递增。

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

if (itrSchedulerList->timeEndTime == ctSyatemTime.GetTime())
{
    itrSchedulerList = gSchedulerList.erase(itrSchedulerList);          
}
else
{
  ++itrSchedulerList;
}

并将其从for循环中取出。