Как мы выполняем итерации через все элементы набора при вставке новых элементов в него?

События/делегаты C# многоадресно передаются, таким образом, делегат самостоятельно список. Из класса, для получения отдельных вызывающих сторон можно использовать:

if(field != null) { // or the event-name for field-like events
    // or your own event-type in place of EventHandler
    foreach(EventHandler subscriber in field.GetInvocationList())
    {
        // etc
    }
}

Однако для присвоения внезапно просто используйте + = или прямое присвоение:

SomeType other = ...
other.SomeEvent += localEvent;
6
задан Rohit Banga 10 October 2009 в 05:00
поделиться

4 ответа

Фактически, итератор все еще действителен. Набор - это контейнер на основе узлов.

Проблема в том, что в наборе элементы всегда сортируются. Перед вставкой ваш набор выглядит так:

3 4 5
^
iter

После вставки ваш набор выглядит следующим образом:

1 2 3 4 5 6
    ^
    iter

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

6
ответ дан 10 December 2019 в 02:49
поделиться

Я хочу посетить каждый элемент набора ровно один раз, поскольку его размер увеличивается во время обхода. любой способ сделать это? - iamrohitbanga 1 час назад

В вашем коде a1 = [3, 4, 5]. Затем вы получаете итератор, который указывает на начало a1, то есть «3». Затем вы вставляете новые элементы в a1, в результате получаем [1, 2, 3, 4, 5, 6]. Однако вы по-прежнему указываете на то же значение - «3». Итак, теперь вы продолжаете итерацию и напечатаете 3, 4, 5, 6.

Все еще не ясно, зачем вам вставлять список после получения итератора. Почему вы не можете вставить элементы перед , повторяя их, как упомянул @camh?

Если вы все еще хотите сделать это, используйте вектор, так как это позволит вам добавлять элементы в конец списка, это означает, что вы по-прежнему будете указывать на «3», но теперь список будет [3, 4, 5, 1, 2, 6], и они будут распечатаны в указанном порядке.

Или добавьте следующее:

    for (iter = a1.begin(); iter != a1.end(); ++iter)
    {
            if (x == 0) {
                    x = 1;
                    a1.insert(a2.begin(), a2.end());
                    // Reset the iterator since we've modified the list
                    iter = a1.begin();
            }
            cout << *iter << endl;
    }

Это уродливый взломанный код, который будет работать только в определенных обстоятельствах. Лучшее решение - @ camh's. Если у вас есть причины, по которым вы не можете сделать это таким образом, нам нужна дополнительная информация.

2
ответ дан 10 December 2019 в 02:49
поделиться

Значит, ваш парень делает слияние полным кошмаром? Отменить все форматирование, которое эстетично для меня, автора и основного сопровождающего того кода, который вы только что зарегистрировали?

Таким образом, любые итераторы остаются действительными после того, как вы вызываете insert (так что вы можете продолжать разыменовывать указатель и продвигать его, и гарантированно достигнете end ()). Но любые вставленные элементы могут появиться «до» вашего итератора, и вы не увидите их, пока не вызовете begin () снова.

1
ответ дан 10 December 2019 в 02:49
поделиться

how do we code such a situation.

You recognise that the code within the "if (x == 0)" block is executed only once and that nothing in that block references the loop variable(s), and as such, should be moved outside the loop.

    a1.insert(a2.begin(), a2.end());
    for (iter = a1.begin(); iter != a1.end(); ++iter)
    {
            cout << *iter << endl;
    }

I don't know if your real code can be refactored in a similar way, but with regard to the validity of your iterator after insertion, this says:

Set has the important property that inserting a new element into a set does not invalidate iterators that point to existing elements.

So, your iterator remains valid, but you cannot necessarily assume that all the elements inserted will come "after" the current position and that they will be reached by any current Forward Iterators.

0
ответ дан 10 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: