2013-06-24 4 views
-1

я объявил массив множествC++, значение извлекается из набора не появляется в наборе, стирая его из набора

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); 
           } 
         } 
        } 
       } 
+1

Только примечание, идентификаторы, начинающиеся с символа подчеркивания, за которым следует буква верхнего регистра и идентификаторы, содержащие два последовательных символа подчеркивания, зарезервированы для компилятора. Не используйте их. –

+0

@CaptainObvlious: спасибо, позаботьтесь. –

ответ

0

Ваш набор отсортирован по poi nter value, что, вероятно, довольно бесполезно; в любом случае он будет передаваться идентификатором объекта вместо значения объекта. Если это не то, что вы хотите, вам придется предоставить свой собственный заказ на std :: set (это аргумент шаблона), который сортируется по фактическому значению.

+0

спасибо fr ur ответить, На самом деле я хочу сохранить указатель на объекты только в другом пуле памяти. В любом случае эти указатели будут уникальными. –

0

Вы увеличиваете итератор после стирания установленного элемента, на который он указывал. В стандарте говорится, что вы не должны этого делать.

IRC все итераторы, указывающие на элемент контейнера, недействительны, когда этот элемент стирается. В некоторых контейнерах все итераторы недействительны, независимо от того, на какой элемент они указывают.

Не знаю о наборах, но при использовании списков-итераторов достаточно увеличить итератор перед удалением элемента.