перебрать множество переходит в бесконечный цикл - PullRequest
0 голосов
/ 30 марта 2019

Я использовал один и тот же код в обоих моих файлах. и один работает правильно, а другой (этот) переходит в бесконечный цикл.

int arr[5] = {3, 1, 3, 5, 6};
int main() {
    int T = 1; 
    set<int> s;
    for (int tc = 0; tc < T; tc++) {
        s.emplace(0);
        for (auto x : arr) {
            auto end = s.end();
            for (auto it = s.begin(); it != end; it++) {
                // here's where goes to infinite loop
                // and i couldn't figure out why..
                s.emplace(*it+x); 
            }
        }
    }
    return 0;
}

ниже одного хорошо работает один

using namespace std;

int main() {
    int arr[5] = {3,1,3,5,6}, sum=20;
    set<int> s;
    s.emplace(sum);
    for (auto x : arr) {
        auto end = s.end();
        for (auto it = s.begin(); it != end; it++) {
            s.emplace(*it-x);
        }
    }
    return 0;
}

ожидаемые результаты: s = {1, 4, 7, 8, ...} вся сумма всего подмножества обр. но не работает должным образом .. я не знаю почему ..

1 Ответ

0 голосов
/ 30 марта 2019

Проблема заключается в том, что вы вставляете элементы в набор во время итерации по нему (с помощью дальнего цикла). Семантика цикла дальнего действия не включает запоминание состояния диапазона до начала цикла; это как писать:

for(auto it = std::begin(container); it < std::end(container); it++)

Теперь std::set - это заказанный контейнер. Поэтому, когда вы вставляете / вставляете элементы меньше , чем тот, на который указывает ваш итератор, вы не увидите их позже в итерации; но если вы вставите больше элементов, вы увидите их . Таким образом, вы заканчиваете итерацией только по вставленным элементам, бесконечно.

Что вам, вероятно, следует сделать, это не вставлять новые элементы в s во время итерации, а вместо этого помещать их в какой-то другой контейнер, а затем, наконец, сбросить все содержимое этих новых контейнеров в набор (например, с std::inserter для набора и std::copy).

(Кроме того, в целом весь ваш код кажется подозрительным, т. Е. Я сомневаюсь, что вы действительно хотите сделать что-то из этого в первую очередь.)

...