-1

我已经声明了集合数组

std::set<md_core::Sample *> _SessionSet[MAX_SESSIONS];

现在我写了两个函数

 void insertIntoTrdSessionSet(unsigned char index, md_core::Sample *sample)
    {
        _SessionSet[index].insert(sample);
    }

    bool removeFromTrdSessionSet(md_core::Sample *sample, unsigned char i = MAX_SESSIONS)
    {
        if(i != MAX_SESSIONS)
        {
            if(_SessionSet[i].erase(sample))
                return true;
        }
        else
        {
            for(i = 0; i < MAX_SESSIONS ; i++)
            {
                if(_SessionSet[i].erase(sample))
                {
                    return true;
                }
            }
        }
        return false;
    }

现在我从集合中一一提取一个值并尝试删除,但它表明该值不存在于结构中

  for(i = 0; i < MAX_SESSIONS ; i++)
                {
                    if(i != pMsg->_Session)
                    {
                        std::set<Sample *>::iterator it = pSub->_SessionSet[i].begin();
                        for(;it != pSub->_SessionSet[i].end(); it++)
                        {
                            sample = *it;
//now call delete for the sample

                                if(!pSub->removeFromTrdSessionSet(sample, i))
                                {
                                   logV(MD_WARN_MSG, "No such sample %d to delete from odrders map for  session %u", sample, index);
                                }
                        }
                    }
                }
4

2 回答 2

0

在删除它指向的集合项后,您正在递增迭代器。标准说你不应该那样做。

IRC 指向容器元素的所有迭代器在删除该元素时都将失效。在某些容器上,所有迭代器都无效,无论它们指向什么元素。

不知道集合,但是在使用列表迭代器时,在删除元素之前增加迭代器就足够了。

于 2013-06-24T15:00:28.683 回答
0

你的集合是按指针值排序的,这可能没什么用;无论如何,它将通过对象身份而不是对象值进行。如果这不是您想要的,您将必须向 std::set (它是一个模板参数)提供您自己的排序,该排序按实际值排序。

于 2013-06-24T13:43:07.920 回答