2012-04-27 65 views
14

I wszyscy,Jak zdobyć pierwszy element std :: set

Znalazłem dziwny błąd w moim oprogramowaniu.

Wewnątrz pętli while, gdzie mogę usunąć elementy z std :: set, chcę zawsze wziąć pierwszy element, aż pojemnik jest pusty:

std::set< int*> nodes; 
// Fill nodes 
for (int i=0; i<10;i++) 
    nodes.insert(new int); 
// 
while (!nodes.empty()) 
{ 
int* pivot = (*nodes.begin()); 
// do some operation with pivot erasing some elements from nodes 
} 

Uważam, że wdrożenie pierwszego elementu ten sposób prace z gcc, ale nie z MSVC, zawiesza się tam, gdzie próbuję wyłuskać iterator (*nodes.begin()).

Czy dwie implementacje std :: set zachowują się inaczej?

Chciałbym mieć strukturę danych bez różnic w implementacji, czy to możliwe?

Chyba muszę zmienić strukturę danych dla tego rodzaju operacji

+0

co dzieje się po twojej dereference? – Nick

+5

Co to jest "wykonaj operację z pivot wymazywanie niektórych elementów z węzłów" –

+4

po prostu dereferencja taka * (nodes.begin()) – v01d

Odpowiedz

2

praca kod dobrze w VS2010, mybe należy zaktualizować VCC.

-3

Nie można użyć iteratora na takim zestawie, ponieważ usunięcie elementu z zestawu unieważnia iterator. Gdy rozmiar zestawu spadnie poniżej pewnego progu (w oparciu o początkowy rozmiar podczas konfigurowania iteratora), zmodyfikuje on bazowe miejsce przechowywania danych na stercie, co spowoduje pozostawienie wskaźnika, który jest wskazany przez iterator, wskazując na bzdurę.

Patrz pod ważności iteratora: http://www.cplusplus.com/reference/set/set/erase/

(* nodes.begin()) jest to, co chcesz, po prostu nie można usunąć ze zbioru swojej iteracja