Ответ 1
ваш код хорошо работает в VS2010, mybe вы должны обновить свой vcc.
Я тебя всех,
Я нашел странную ошибку в своем программном обеспечении.
Внутри цикла while, где я удаляю элементы из std:: set, я хочу всегда перенести первый элемент, пока контейнер не станет пустым:
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
}
Я обнаружил, что реализация первого элемента таким образом работает с gcc, но не с MSVC, он сбой, когда я пытаюсь разыменовать итератор (*nodes.begin())
.
Выполняются ли две реализации std:: set по-разному?
Я хотел бы иметь структуру данных без каких-либо различий в реализации, возможно ли это?
Возможно, я должен изменить структуру данных для этого вида операций
ваш код хорошо работает в VS2010, mybe вы должны обновить свой vcc.
Вы не можете использовать итератор в таком наборе, как удаление элемента из набора делает недействительным итератор. Когда размер набора становится ниже определенного порога (на основе начального размера при настройке итератора), он будет изменять базовое хранилище ваших данных в куче, которое оставит указатель, который является вашим итератором, указывающим на дерьмо.
См. раздел "Итеративность": http://www.cplusplus.com/reference/set/set/erase/
(* nodes.begin()) делает то, что вы хотите, вы просто не можете удалить из набора итераций через