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

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

11.09.2016, 21:20. Показов 4499. Ответов 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, 21:43
Ну если тут просто удаление то можно просто идти в реверсном направлении. Т.е. с конца к началу. Тогда при удалении порядок обхода не изменяется.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 21:45
Обходить/удалять элементы вектора с конца.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 21:50
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

rikimaru2013 При этом если это вектор и в процессе кроме удаления есть добавления пользовать не итераторы а индексы. Они остаются валидными при реаллоке.,
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 22:24  [ТС]
Там же Add/push - то есть реалок вектора в худчем случаи, в лучшем всё ок)

Добавлено через 2 минуты
Fulcrum_013, вместо (*it) использовать cont[i] повсюду?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
11.09.2016, 22:27
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Подскажите, есть ли методики не писать такие костыли?
Есть такая методика - не писать говнокод

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Или концептуально вы скажите не правильно, что некий тип умеет пушить в родителя?
А ты сам-то как думаешь? Где твои рассуждения?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 22:38  [ТС]
Цитата Сообщение от ct0r Посмотреть сообщение
А ты сам-то как думаешь? Где твои рассуждения?
злой такой - пришёл накричал ушёл (((( Я думаю там всё ок - и нарушение IoC это малое, на что идут люди)
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
11.09.2016, 23:00
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я думаю там всё ок
Это ты в (*it)->Update() можешь что-то запушить в контейнер, я так понял? Или нет?
Представь, что видишь код Update() впервые. Тебе сразу очевидно из кода, что делает цикл - а именно в каком состоянии будет контейнер после его выполнения?
А теперь представь, что надо что-то зарефакторить. Насколько приятно это делать с твоим Update?

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
и нарушение IoC это малое, на что идут люди)
Ради чего идут?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:06
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вместо (*it) использовать cont[i] повсюду?
Ну да. У меня правда для таких дел пользуются заточенные под это контейнеры с выпиливаемым в релизе range-checking.

Добавлено через 4 минуты
Цитата Сообщение от ct0r Посмотреть сообщение
Ради чего идут?
К примеру ради сокращения кода в несколько раз.
Цитата Сообщение от ct0r Посмотреть сообщение
А теперь представь, что надо что-то зарефакторить. Насколько приятно это делать с твоим Update?
Поэтому такие дела обычно выносят под капот специальных контейнеров и абстрактят так, чтобы очень долго не рефакторить.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 23:12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Fulcrum_013, вместо (*it) использовать cont[i] повсюду?
Зачем?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
11.09.2016, 23:24
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
есть ли методики не писать такие костыли
1) init + update
2) расширенная версия : init+ invalidate + validate + update (с учетом зависимостей дитя-родитель), либо юзать умные указатели.
3) оставить костыль если этот код локальный.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.09.2016, 23:25
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Подскажите, есть ли методики не писать такие костыли?
обычно делают так:
есть два контейнера.
один для новеньких.
другой для стареньких.

рабочий конвейер последовательно обновляет стареньких.
дети не могут никак влиять на контейнер.
они могут лишь возвращать собственный статус:
"я активен", "я свободен", "я завершился", и тп.

если апдейт приводит к рождению нового ребенка,
то он добавляется в контейнер новеньких.

потом, когда пробег по контейнеру стареньких завершается,
родитель перемещает новеньких к стареньким.
1
11.09.2016, 23:25  [ТС]

Не по теме:

Цитата Сообщение от Nosey Посмотреть сообщение
оставить костыль
я знал, что он тебе понравится - красивый такой :yahoo:

0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:26
Цитата Сообщение от Avazart Посмотреть сообщение
Зачем?
Затем что у него кроме удаления еще и добавление. Если при этом добавлении вектор реалокнется итератор станет невалидным в отличии от индекса.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 23:26  [ТС]
hoggy, ну то бишь мой костыль и есть то о чём вы советуете:?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.09.2016, 23:29
Цитата Сообщение от hoggy Посмотреть сообщение
дети не могут никак влиять на контейнер
Далеко не всегда такое поведение является оптимальным.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 23:30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если при этом добавлении вектор реалокнется итератор станет невалидным в отличии от индекса.
Какой итератор?
Add и Update не могут же выполнятся одновременно.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 23:30  [ТС]
Fulcrum_013, кстати это работает только при гарантии add_only - ведь при обращению по индексу

C++
1
2
3
const int index = 4;
cont[i]->Update();
cont[i]->Finished();
Есть вероятность, что строка 2 и 3 будут работать с разными сущностями.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
11.09.2016, 23:33
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я знал, что он тебе понравится - красивый такой
Ну дык, другие варианты, этоже тоже самое только приправлены ООП, что добавит расширяемости, строгости, сложности, если это не нужно в первом приближении и завязаностей на этот код будет очень мало, то ..., ну вы поняли
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
11.09.2016, 23:33  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Add и Update не могут же выполнятся одновременно.
Тема как раз об этом. Что было нарушено IoC и через синглтон пушиться в вектор дополнительный элемент
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2016, 23:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru