C++ C++;,从集合中删除时,从集合中提取的值不会出现在集合中

C++ C++;,从集合中删除时,从集合中提取的值不会出现在集合中,c++,set,stdset,C++,Set,Stdset,我已经声明了集合数组 std::set<md_core::Sample *> _SessionSet[MAX_SESSIONS]; std::set _sessionstart[MAX_SESSIONS]; 现在我写了两个函数 void insertIntoTrdSessionSet(unsigned char index, md_core::Sample *sample) { _SessionSet[index].insert(sample);

我已经声明了集合数组

std::set<md_core::Sample *> _SessionSet[MAX_SESSIONS];
std::set _sessionstart[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;
    }
void insertintortrdSessionSet(无符号字符索引,md_core::Sample*Sample)
{
_SessionSet[索引]。插入(样本);
}
bool removeFromTrdSessionSet(md_core::Sample*Sample,unsigned char i=MAX_会话)
{
如果(i!=最大会话数)
{
if(_[i].擦除(示例))
返回true;
}
其他的
{
对于(i=0;i
现在我一个接一个地从集合中提取一个值并尝试删除,但它表明该值在结构中不存在

  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);
                                }
                        }
                    }
                }
用于(i=0;i\u会话)
{
std::set::iterator it=pSub->_sessionstart[i].begin();
for(;it!=pSub->_sessionstart[i].end();it++)
{
样本=*它;
//现在为示例调用delete
如果(!pSub->removeFromTrdSessionSet(示例,i))
{
logV(MD_WARN_MSG,“没有这样的样本%d要从会话%u的odrders映射中删除”,样本,索引);
}
}
}
}

您的集合是按指针值排序的,这可能是非常无用的;在任何情况下,它都将按对象标识而不是对象值进行。如果这不是您想要的,则必须向std::set(它是一个模板参数)提供您自己的排序,该参数按实际值排序。

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

IRC当一个容器元素被擦除时,所有指向该元素的迭代器都将失效。在某些容器上,所有迭代器都无效,无论它们指向哪个元素


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

谢谢fr ur reply,实际上我只想在其他内存池中存储指向对象的指针。不管怎样,这些指针都是唯一的值。只需注意,以下划线开头,后跟大写字母的标识符和包含两个连续下划线的标识符是为编译器保留的。不要用它们。@CaptainObvlious:谢谢,我会小心的。