列表的pop_front不删除列表的元素

时间:2014-12-18 05:12:16

标签: c++ stl

我的地图有以下定义,

typedef std::list<HolderClass*> QueueHolderList;
map<string, QueueHolderList > OrderQueue;

并按上面的push_back方式填写,

map<string, QueueHolderList >::iterator itr = OrderQueue.find(val);
if(itr == OrderQueue.end())
{
    QueueHolderList qHolder;
    qHolder.push_back(new HolderClass());
}
else
{
    itr->second.push(new TransactionHolder());
}

但是当我尝试使用pop_front(下面代码片段)删除元素时,它不删除元素,代码下面运行while循环并检查OrderQueue和每个val,如果size是grater则为零然后删除元素。

map<string, QueueHolderList>::iterator itr;

for(itr = OrderQueue.begin(); itr != OrderQueue.end(); itr++)
{
    string gen2Aotag = itr->first;
    HolderClass q = itr->second;

    if(q.size() > 0)
    {
        for(int i = 0; i < q.size(); i++)
        {
            if(q.front())
            {   
                .......... other code ............
                delete q.front();
                q.front() = NULL;
                q.pop_front();
            }
        }
    }
}

问题是当我重新迭代orderQue映射,然后找到相同的已删除项目列表(虽然使用pop_front删除)并导致seg错误,因为它指向一些垃圾位置并尝试使用该垃圾访问代码

我哪里出错了?或者我的apporach不正确?请帮我识别一下。

1 个答案:

答案 0 :(得分:1)

您没有向map添加任何内容。

map<string, QueueHolderList >::iterator itr = OrderQueue.find(val);
if(itr == OrderQueue.end())
{
    QueueHolderList qHolder;
    qHolder.push_back(new HolderClass());
    // This adds an item to the object on the stack but not to the map.

    // You need:
    OrderQueue[val] = qHolder;
}
else
{
    itr->second.push(new TransactionHolder());
}