Я объявил массив множеств
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);
}
}
}
}
Ваш набор отсортирован по значению указателя, что, вероятно, довольно бесполезно; в любом случае он будет идти по идентификатору объекта, а не по значению объекта. Если это не то, что вам нужно, вы должны будете указать свой собственный порядок в std :: set (это аргумент шаблона), который сортирует по фактическому значению.
Вы увеличиваете итератор после удаления элемента set, на который он указывал.
Стандарт говорит, что вы не должны этого делать.
IRC, все итераторы, указывающие на элемент контейнера, становятся недействительными при удалении этого элемента. В некоторых контейнерах все итераторы становятся недействительными независимо от того, на какой элемент они указывают.
Не знаю насчет множеств, но при использовании списочных итераторов достаточно увеличить итератор перед удалением элемента.