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

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

11.09.2016, 21:20. Показов 4451. Ответов 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
12.09.2016, 11:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
да правильно)
И насколько понимаю порядок соблюдать не обязательно?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 11:20
HelicopterK52, Ну я не знаю как это реализовывается, но идея "самоудаления" и вообще то что элемент знает о контейнере кажется мне не продуктивной в этом случае.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 11:25
Цитата Сообщение от Avazart Посмотреть сообщение
Нужно просто стараться его избегать или выбрать другой контейнер - std::list
И каждый раз выдергивать их по всей ОЗУ? Такие тормоза будут за счет промомахов кеша при каждом проходе что уж лучше удалять за О(n) но в кеше. А еще лучше постараться сделать так чтобы порядок их следования не имел значения. С партиклами это очень даже возможно.

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Да? Т.е и что будет если один элемент удалится и нумерация изменится?
Слежением за этим вопросом должен заниматься контейнер при удалении. Плюс одна операция присваивания инта при каждом перемещении элемента и не более.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.09.2016, 11:29  [ТС]
Fulcrum_013, нужно естественно - z-order ведь. И с раскрытием карт про партикл думаю беседа плавно переплывет в частный случай - хотя это не так)
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 11:38
Цитата Сообщение от Avazart Посмотреть сообщение
Нужно просто стараться его избегать или выбрать другой контейнер - std::list
Ну для этой системы я бы выбрал другой вычислитель который на другом языке программируется (GLSL или HLSL) и работает по совсем другим принципам (отдельный поток на каждый элемент), а соответственно и функциклит немного по другому - переписывает и выживших и добавленных в другой массив.

Добавлено через 3 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
нужно естественно - z-order ведь
Так тогда и в конец добавлять нельзя получается а нужно искать место для вставки в соответствии с Z добавляемого

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
У меня удаление всех элементов сразу за один цикл.
а цикл смещения который у erase под капотом?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 11:49
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а цикл смещения который у erase под капотом?
Да но смешения минимальное кол-во за счет обратного прохода.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 11:50
Avazart Вот такое отложенное удаление поэффективнее erase будет:
C++
1
2
3
4
5
6
7
8
9
10
11
void CStringList::Pack(){
     int NewCount=0;
 
     for(NewCount=0;NewCount<FCount;NewCount++) 
           if(!Data[i]) break;
   
     for (int i=NewCount+1;i<FCount; i++) 
          if (Data[i]) Data[NewCount++]=Data[i];
 
     FCount=NewCount;
}
Правда вопрос с повторным перебором всей последовательности при каждом апдейте при этом не снимается.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 11:50
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
с раскрытием карт про партикл думаю беседа плавно переплывет в частный случай - хотя это не так)
Так общего случая и не может быть ...
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.09.2016, 12:04  [ТС]
Avazart, ну вот первый пошёл) Может - вот другой пример:

- игра с монстрами, идёт монстр по карте у него логика: каждые 50 секунд, если хватает маны вызывать двух волков - куда ему их пушить? Да туда же где он сам. Когда он их вызывает? В Update(dt) когда просят обновить его логику и его личный счётчик _timeDt перевалит за 50 секунд.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 12:05
Цитата Сообщение от Avazart Посмотреть сообщение
Так общего случая и не может быть ...
С этим утверждением абсолютно согласен
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.09.2016, 12:06  [ТС]
Пример номер 3:

Кнопка в приложении "купить" - тыкаешь, а она через N время пушит в контейнер где она сама еще 2 кнопки "Вы уверены?" "Или не уверены"
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 12:17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
игра с монстрами, идёт монстр по карте у него логика: каждые 50 секунд, если хватает маны вызывать двух волков - куда ему их пушить? Да туда же где он сам. Когда он их вызывает? В Update(dt) когда просят обновить его логику и его личный счётчик _timeDt перевалит за 50 секунд.
Летять гуси штурмовики по бескрайнему спейсу ограниченному сферой диаметром 50км. Когда юзеру приспичило затапить гашетку пуляють ракеты пачками. Ракеты в тот же массив пишутся. Когда ракета выработала топливо или вышла за радиус сферы она взрывается (самоудаляется) докидывая при этом в массив объект взрыв, который тоже самоудаляется по завершении. Порядок в котором производится апдейт неважен поэтому живет на константном по времени инстансном добавлении в конец и удалении обменом с последним, при обработке обход сзади наперед. Для самой обработки логики порядок обработки не важен потому как она условно-синхронная. А для отрисовки все равно z-буфер никуда не денется бо как оно 3D.
Да кстати начинал с одного списка потом сдеал их 5. Отдельно вызываются пересчет внутренних процессов, скорости,
движения, коллизий (2 списка - способен вызвать колизию (только подвижные) и способен к столкновению (подвижные и стационарные в которые можно въехать - пули и мелкие ракеты в нем не присутствуют))
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
12.09.2016, 12:19  [ТС]
Fulcrum_013, запихнуть ракету и взрыв в одни контейнер - фу-фу-фу таким быть))) И какой там общий родитель? IBadabum ?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 12:58
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И какой там общий родитель? IBadabum ?
TPhisicObject.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
запихнуть ракету и взрыв в одни контейнер - фу-фу-фу таким быть)))
Это космос. Взрыв не стоит на месте а продолжает полет по траектории в процессе горения, правда уже без ускорения.
А вот пули в отдельном массиве живут, тоже потомке TPhisicObject который в общем массиве живет и в своих апдейтах апдейтит пули.

Добавлено через 10 минут
Опять же безусловно общий там список владения. А в самих списках обработки они где в одном где в разных. К примеру взрыв не подписывается на пересчет скорости а ракета на возможность столкновения с ней.

Добавлено через 19 минут
Опять же все построено на концепции "создал объект из прототипа добавил в модель и забыл". Посему в каком состоянии на какие апдейты подписаться объекты сами знают. Т.е. сам контейнер только среда существования которая обеспечивает добавление/отслеживание удаления,подписку/отписку на апдейты ,и условно-синхронный вызов апдейтов для подписчиков.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 13:27
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
- игра с монстрами, идёт монстр по карте у него логика: каждые 50 секунд, если хватает маны вызывать двух волков - куда ему их пушить? Да туда же где он сам. Когда он их вызывает? В Update(dt) когда просят обновить его логику и его личный счётчик _timeDt перевалит за 50 секунд.
Мм в чем проблема использовать std::list ?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 13:32
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Кнопка в приложении "купить" - тыкаешь, а она через N время пушит в контейнер где она сама еще 2 кнопки "Вы уверены?" "Или не уверены"
Ну в таком случае я бы просто отдельный модальный диалог с оными двумя кнопками показывал бы (при необходимости модальный относительно формы покупки а не всего интерфейса/приложения).

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Мм в чем проблема использовать std::list
разве что лепить лист с пулами константного времени распределения элементов. Тогда он еще как то будет в кеше присутствовать. Иначе элементы придется по всему ОЗУ выдергивать при доступе а это очень медленное занятие. т.е. получится дернул из листа указатель для чего подождал несколько сот тактов и только потом уже сам объект дергаешь.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.09.2016, 13:42
Ну так там все равно по указателю.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 13:49
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так там все равно по указателю.
Только с листом и список указателей по всей ОЗУ размазан а не в одном месте как с массивом.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
12.09.2016, 13:57
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Только с листом и список указателей по всей ОЗУ размазан а не в одном месте как с массивом.
Да в общем-то все равно же. Объект скорее всего по размеру будет больше кэш-линии (64 байта), так что в целом пофиг откуда читать. В случае с вектором можно еще конечно рассчитывать на data prefetch, но крайне сомневаюсь, что там требования к производительности настолько высоки, что стоило бы об этом задумываться
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.09.2016, 14:14
Цитата Сообщение от Voivoid Посмотреть сообщение
В случае с вектором можно еще конечно рассчитывать на data prefetch, но крайне сомневаюсь, что там требования к производительности настолько высоки, что стоило бы об этом задумываться
тесты производительности контейнеров. Обход массива соответствует линейному поиску. На вскидку вектор будет быстрее раза в 3 на наиболее часто используемой операции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.09.2016, 14:14
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Закрытая тема Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru