Проблема заключается в том, что вы вставляете элементы в набор во время итерации по нему (с помощью дальнего цикла). Семантика цикла дальнего действия не включает запоминание состояния диапазона до начала цикла; это как писать:
for(auto it = std::begin(container); it < std::end(container); it++)
Теперь std::set
- это заказанный контейнер. Поэтому, когда вы вставляете / вставляете элементы меньше , чем тот, на который указывает ваш итератор, вы не увидите их позже в итерации; но если вы вставите больше элементов, вы увидите их . Таким образом, вы заканчиваете итерацией только по вставленным элементам, бесконечно.
Что вам, вероятно, следует сделать, это не вставлять новые элементы в s
во время итерации, а вместо этого помещать их в какой-то другой контейнер, а затем, наконец, сбросить все содержимое этих новых контейнеров в набор (например, с std::inserter
для набора и std::copy
).
(Кроме того, в целом весь ваш код кажется подозрительным, т. Е. Я сомневаюсь, что вы действительно хотите сделать что-то из этого в первую очередь.)