Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Изменение контейнера во время итерационного перебора

11.09.2016, 21:20. Показов 4457. Ответов 100
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Add( Some* ptr )
{
    cont.push_back( ptr );
}
void Update()
{
    for ( auto it = std::begin( cont ); it != std::end( cont ); )
    {
        ( *it )->Update();
        if ( ( *it )->Finished() )
        {
            it = cont.erase( it );
        }
        else
        {
            ++it;
        }
    }
}
Если в Update как-то запушить в cont - то итератор не валиден по понятным причинам, как и ++it. Пришлось извращаться:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Add( Some* ptr )
{
    if(_protect)
        delay.push_back(ptr)
    else
        cont.push_back( ptr );
}
void Update()
{
    _protect = true;
    for ( auto it = std::begin( cont ); it != std::end( cont ); )
    {
        ( *it )->Update();
        if ( ( *it )->Finished() )
        {
            it = cont.erase( it );
        }
        else
        {
            ++it;
        }
    }
    _protect = false;
    PushAllDelayToContAndClear();
}
Подскажите, есть ли методики не писать такие костыли? Или концептуально вы скажите не правильно, что некий тип умеет пушить в родителя?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.09.2016, 21:20
Ответы с готовыми решениями:

Время выполнения рекурсивного и итерационного алгоритма быстрой сортировки
Почему вот это : void sort(int *ar, int L, int R){ int i, j, x, buf; x = ar; i = L; j = R; do { ...

Определить время перебора всех паролей с параметрами
Определить время перебора всех паролей с параметрами. Алфавит состоит из n символов. Длина пароля символов k. Скорость перебора s...

Посчитать время полного перебора всех паролей
Задача такая: есть пароль из 15 символов,состоящий из A-z = 52 + знаки (я насчитал 32) Есть сервер с прямым доступом со скоростью...

100
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть вероятность, что строка 2 и 3 будут работать с разными сущностями.
Если добавляет только в конец и удаляется только текущий то при обходе с конца такой вероятности нет.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 23:35  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
удаляется только текущий
такое не задокументируешь - это как бомба в коробке в шкафу - сейчас знаешь, что там бомба и не откроешь. Но как только придёт Новый Год и полезешь за игрушками для ёлки .... ну вы поняли)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.09.2016, 23:37
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну то бишь мой костыль и есть то о чём вы советуете?
да.

подход с двумя контейнерами решает сразу две инженерные задачи:
1.
многопоточная защита.

2.
гарантирует, что при обратной раскрутке стека,
он не вернется к погибшему ребенку.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 23:37
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Тема как раз об этом. Что было нарушено IoC и через синглтон пушиться в вектор дополнительный элемент
Не понял. Имеете ввиду есть другие потоки?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.09.2016, 23:41
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
то бишь мой костыль и есть то о чём вы советуете?
да.

этот подход решает сразу две инженерные задачи:

1.
решает проблему многопоточной защиты.

2.
при обновлении, дети могут сигналить друг другу.
данный подход гарантирует, что при обратной раскрутке стека,
все объекты валидны.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:43
Цитата Сообщение от Avazart Посмотреть сообщение
Какой итератор?
it который.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 23:44
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
it который.
Ну так такое возможно только если из нескольких потоков вызовы идут, но тогда и в других местах будут проблемы.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:45
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
такое не задокументируешь - это как бомба в коробке в шкафу - сейчас знаешь, что там бомба и не откроешь. Но как только придёт Новый Год и полезешь за игрушками для ёлки .... ну вы поняли)
Такое не документируется а прячется под капот взаимодействия контейнера и элемента и на 100% инкапсулируется от внешнего вмешательства.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 23:47  [ТС]
Fulcrum_013, а как вам решение hoggy ? Ведь я через годы гавнокодства интуитивно пришёл к примерно такому же решению.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:48
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так такое возможно только если из нескольких потоков вызовы идут
Такое возможно если в том же потоке идет добавление изнутри ( *it )->Update();
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 23:50
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Такое возможно если в том же потоке идет добавление изнутри ( *it )->Update();
Мм, а зачем? Зачем использовать тот же "внешний" метод? Т.е. разбить код на внешние и внутренние методы и ...
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:51
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а как вам решение hoggy
Зависит от ситуации. Пример - контейнеров (списков обработки) несколько, соответственно когда в каком содержаться решает сам полиморфный элемент (содержаться может одновременно в нескольких), причем решает в процессе обхода любого из контейнеров. Обходы для контейнеров идут подряд с вызовом своего виртуального метода элемента для каждого контейнера. С таким решением с отложенной вставкой получится такая каша что ховайся.
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
11.09.2016, 23:56
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
К примеру ради сокращения кода в несколько раз.
Почему он должен сократиться в несколько раз?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну то бишь мой костыль и есть то о чём вы советуете:?
По сути да, но у тебя в реализации все намешано в кучу. Какие сложности изменить все так, чтобы обойтись локальным delay? Нафига оно всему объекту?

Цитата Сообщение от Nosey Посмотреть сообщение
этоже тоже самое только приправлены ООП, что добавит расширяемости, строгости, сложности, если это не нужно в первом приближении и завязаностей на этот код будет очень мало, то ..., ну вы поняли
Какие сложности создаст вынесение логики добавления из Update элемента во внешний Update?
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:58
Цитата Сообщение от ct0r Посмотреть сообщение
Почему он должен сократиться в несколько раз?
Пример с несколькими списками обработки постом выше.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.09.2016, 00:01  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С таким решением с отложенной вставкой получится такая каша что ховайся.
Наведите пример? Пока что вижу только не вызван тут же апдейт - хотя он и не нужен.

Цитата Сообщение от ct0r Посмотреть сообщение
По сути да, но у тебя в реализации все намешано в кучу. Какие сложности изменить все так, чтобы обойтись локальным delay? Нафига оно всему объекту?
Так и так локально ведь решено. Или нет? Была ошибка - решил - задумался, а не решил ли я её как гавнокодер. Ведь чую запах с монитора - создал темку)

Цитата Сообщение от ct0r Посмотреть сообщение
Какие сложности создаст вынесение логики добавления из Update элемента во внешний Update?
Так не во всех случаях же ж такое - просто один элемент понял, что он хочет себе завести 2 соседа - но архитектура он него такого не ожидала - я локально "разрешил" каждому элементу (раз у них "права на пуш" есть и ситуация как оказалась возможной) пушить "безопасно"
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 00:06
Цитата Сообщение от Avazart Посмотреть сообщение
ачем использовать тот же "внешний" метод? Т.е. разбить код на внешние и внутренние методы и ...
Я так понял это не тот же метод а абсолютно другой виртуальный метод элемента в котором он может еще элементов в контейнер добавить и/или решить что он в этом контейнере свое отжил.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
12.09.2016, 00:11
Так каким образом за счет этого
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
соответственно когда в каком содержаться решает сам полиморфный элемент
кол-во кода должно уменьшиться в несколько раз?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Так и так локально ведь решено.
Локально в пределах одной функции? Я пока вроде наблюдаю, что delay размазан по нескольким и хранится в объекте. Или не так все?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
просто один элемент понял, что он хочет себе завести 2 соседа
Почему это должен понимать именно элемент, а не та штука, что находится снаружи?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.09.2016, 00:15  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
Или не так все?
Да хранится в объекте - используется только в методе Update

Цитата Сообщение от ct0r Посмотреть сообщение
Почему это должен понимать именно элемент, а не та штука, что находится снаружи?
Потому, что это полиморфизм? Вот он один такой - решил выделится - среди 20 других типов, что ему нужно соседи
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 00:17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Наведите пример? Пока что вижу только не вызван тут же апдейт - хотя он и не нужен.
Ну к примеру. Есть списки обработки. Есть элементы которые решают сами когда им в каком списке жить и когда вообще пора. Для каждого списка обработки свой обход с вызовом своей виртуальной функции элемента. При этом элемент в каждой из функций может решать как вопрос о своем прибывании в каждом из контейнеров так и добавить в систему еще элементов которые тоже сами при добавлении решают в каких списках им поселиться. Обходятся все контейнеры по очереди. При этом будет довольно сложно если вообще возможно избежать каши с вопросом у кого и когда вставка/удаление отложенные у кого сразу.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 00:17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Я так понял это не тот же метод а абсолютно другой виртуальный метод элемента в котором он может еще элементов в контейнер добавить и/или решить что он в этом контейнере свое отжил.
Слишком мало кода что бы понять, но явно что-то не так спроектировано.

Например почему вектор, а не список...

Почему не разбить на два метода update() и removeFinished()
Some* newSome = ( *it )->Update(); может возвращать новый порожденный элемент и затем помещать его в delay.

Итп.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2016, 00:17
Помогаю со студенческими работами здесь

Изменение z-index контейнера из выполняемого скрипта
К празднику (23-е февраля) понадобилось создать на сайте проезжающий внизу страницы время от времени танк. Со скриптом вроде...

Удаление из контейнера элемента и изменение его размеров
textList = new ArrayList<>(); //... textList.remove(textList.size()-1); Почему после выполнения этого кода размер textList не...

Изменение содержимого контейнера при переключении радиокнопки
Имеется товар в интернет-магазине. у него несколько модификаций, которые выбираются через переключатель в форме. Также имеется цена,...

Изменение содержимого контейнера при переключении радиокнопки
Имеется товар в интернет-магазине. у него несколько модификаций, которые выбираются через переключатель в форме. Также имеется цена,...

Изменение выравнивания при выходе текста за пределы контейнера
Добрый день! Подскажите, пожалуйста, как можно реализовать следующую конструкцию: Текст находится в блоке, выравнивание по центру. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru