Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915

Очередь на std::list

09.04.2024, 17:07. Показов 3415. Ответов 56
Метки нет (Все метки)

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

Подскажите, как вы думаете или использовали бы очеред задач на основе std::list ?

В моем случае std::list нужен потому что:

-Удаление самой задачи происходит из самой задачи.

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

Поэтому при вставке и удалении мне нужна гарантия валидности итератора. Вроде бы все удобно, но тут вспомнил про фрагментацию.

А так как задачи будут помещатся и удалятся в std::list непрерывно на протяжении всей работы приложения, то похоже в итоге теоретически это приведет к сущесвенному замедлению работы приложеня ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.04.2024, 17:07
Ответы с готовыми решениями:

Реализация std::list, сложность list::size()
Часто приходилось пользоваться Listом, но сейчас столкнулся с небольшой неоднозначностью. Согласно документации, метод size() в 11...

Записать в файл list (очередь) объектов, в которых содержатся строки string, и считать с файла обратно в list
Извините подскажите пожалуйста, как записать list(очередь) объектов в которых содержаться string, и считать с файла обратно в list;...

Потокобезопасность std::map::end, std::list::end
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

56
Заблокирован
10.04.2024, 12:43
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Optimus11 Посмотреть сообщение
Еще одно без соновательное заявление, да еще и подкрепленое оскорблением.
Ещё один "опытный" программер которому нужно всё разжевыва, да ещё и с подробным доказательством.
А пойти самому изучить то что вам говорят, не судьба.
Можно же просто поныть ))
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 12:47
Цитата Сообщение от Optimus11 Посмотреть сообщение
Значит к методу удаления задачи я добавлю запись о времени удаления в БД.
Ок, и это даже будет работать. Но вот в чем дело, ведь удаление у вас находится внутри самой задачи, а значит сам процесс логирования вы поместите внутрь задачи... и вот что получается:

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

2) предположим, что вашу обработку задач потребуется поместить в DLL, которую в будущем должны использовать еще и другие программы, но они должны будут сохранять свои логи не в БД, а один в файл, а третий вообще в удаленном (remote) диске. Ваши действия?
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
10.04.2024, 12:55  [ТС]
Цитата Сообщение от mashmed135 Посмотреть сообщение
Твоя проблема в том, что ты не можешь чётко объяснить, что тебе нужно. Эксперты также не могут донести свою позицию(либо просто повторяют пару заученных фраз).

Я же выше написал:
Задача получить данные с сервера, на каждые данные своя задача, после получения данных задача должна быть удалена, до тех пор должна крутится проверка получены ли данные или нет.

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

С чего вы вдруг приписали мне в данном случае проблему ?


Цитата Сообщение от mashmed135 Посмотреть сообщение
задача не знает про то, где хранятся контекст и прочие связанные данные.
Че это вдруг ? В задачу может быть переданы на вход все необходимые данные для этого.

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
Ок, и это даже будет работать. Но вот в чем дело, ведь удаление у вас находится внутри самой задачи, а значит сам процесс логирования вы поместите внутрь задачи... и вот что получается:
Метод который запускает процесс удаления вызывается из самой задачи, но физически элемент в котором находится задача удаляется после того, как задача выполнится из самого обьекта класса задачи.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 12:55
Цитата Сообщение от Optimus11 Посмотреть сообщение
Метод который запускает процесс удаления вызывается из самой задачи, но физически элемент в котором находится задача удаляется после того, как задача выполнится из самого обьекта класса задачи.
Здесь нет ответов на мои вопросы
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
10.04.2024, 13:02  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
Здесь нет ответов на мои вопросы
Ну вопрос под первым пунктом я вообще не понял. Я не сомневаюсь, что в вашей голове он звучит ясно, но со стороны не очень ясно.

По второму пункту вопросов - тоже не очень понятно.
Я использую свою очередь именно из DLL - и что мне требуется то она и выполняет. Если нужно что то изменить я измению. У вас поведенеи кода меняется без изменения кода ?
0
Заблокирован
10.04.2024, 13:08
Цитата Сообщение от Optimus11 Посмотреть сообщение
Я же выше написал: ... до тех пор должна крутится проверка получены ли данные или нет.
Да, в целом пойдёт. Значит я не увидел.
Цитата Сообщение от Optimus11 Посмотреть сообщение
Че это вдруг ? В задачу может быть переданы на вход все необходимые данные для этого.
Ну это мало смысла имеет. Передать один int всегда проще.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 13:14
Цитата Сообщение от Optimus11 Посмотреть сообщение
Ну вопрос под первым пунктом я вообще не понял. Я не сомневаюсь, что в вашей голове он звучит ясно, но со стороны не очень ясно
Помоему все ясно. Но попробую перефразировать. У вас есть класс задачи (назовем его Task). У него могут быть какие-то поля (предположим, функция выполнения задачи, время запуска/завершения задачи) и есть определенные методы, например run(), который эту задачу запускает (это, надеюсь, понятно?). Идем дальше. Когда появилась необходимость логирования, вы полезли менять класс Task, тогда как понятие "задача" никак не изменилось. Нет новых атрибутов задачи, нет новых методов связанных с самой задачей (например, приостановить выполнение stop()). Так если само понятие (Task) задачи осталось неизменным, в чем смысл редактировать это понятие (класс Task)?

Цитата Сообщение от Optimus11 Посмотреть сообщение
По второму пункту вопросов - тоже не очень понятно.
Я использую свою очередь именно из DLL - и что мне требуется то она и выполняет. Если нужно что то изменить я измению. У вас поведенеи кода меняется без изменения кода ?
Думаю вы спешите и не вникаете должным образом в то, что я вам пишу. Говорю, допустим ваша программа называется "А". Программа "А" использует "lib.dll", в которой работает ваша очередь и сохраняет после удаления задачи данные в БД. Теперь нужно в программе "Б" тоже использовать "lib.dll" для работы с очередью. Но программа "Б" не хочет сохранять данные в БД после удаления задачи, а хочет сохранять данные в файл. Что будете делать?
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
10.04.2024, 13:18
Цитата Сообщение от Undisputed Посмотреть сообщение
Ок, и это даже будет работать.
Нет, не будет.
Принципиально невозможно зафиксировать время само-удаления.

В момент X объект ещё не может указать время собственного удаления, потому что он ещё не удален.
А в момент, Y, когда объект уже удален, он уже вообще ничего не сможет сделать, потому что его уже не существует.


На практике объекты отчитываются в том, что они по факту уже выполнили какие то возложенные на них задачи. А не о собственном удалении.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
10.04.2024, 13:22  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
Помоему все ясно. Но попробую перефразировать. У вас есть класс задачи (назовем его Task). У него могут быть какие-то поля (предположим, функция выполнения задачи, время запуска/завершения задачи) и есть определенные методы, например run(), который эту задачу запускает (это, надеюсь, понятно?). Идем дальше. Когда появилась необходимость логирования, вы полезли менять класс Task, тогда как понятие "задача" никак не изменилось. Нет новых атрибутов задачи, нет новых методов связанных с самой задачей (например, приостановить выполнение stop()). Так если само понятие (Task) задачи осталось неизменным, в чем смысл редактировать это понятие (класс Task)?
Цитата Сообщение от Undisputed Посмотреть сообщение
Думаю вы спешите и не вникаете должным образом в то, что я вам пишу. Говорю, допустим ваша программа называется "А". Программа "А" использует "lib.dll", в которой работает ваша очередь и сохраняет после удаления задачи данные в БД. Теперь нужно в программе "Б" тоже использовать "lib.dll" для работы с очередью. Но программа "Б" не хочет сохранять данные в БД после удаления задачи, а хочет сохранять данные в файл. Что будете делать?
Возможно я понял, что вы имели ввиду.
Вообщем я сделаю в данном классе Task метод, которые примет на вход колбек или лямбду, которая будет вызыватся обьектом класса при каждом добавлении и удалении задачи, а Пользователь класса сам решит, что с этой информацией делать и куда заносить.

Добавлено через 1 минуту
Цитата Сообщение от eva2326 Посмотреть сообщение
Нет, не будет.
Принципиально невозможно зафиксировать время само-удаления.

Повторю: Метод который запускает процесс удаления вызывается из самой задачи, но физически элемент в котором находится задача удаляется после того, как задача выполнится из самого обьекта класса задачи.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 13:23
Цитата Сообщение от eva2326 Посмотреть сообщение
Нет, не будет.
Принципиально невозможно зафиксировать время само-удаления.
Речь идет о вызове условного logger->log(...) после удаления объекта, странно что мне приходится разъяснять такие мелочи достаточно опытным программистам
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
10.04.2024, 13:27
Цитата Сообщение от Undisputed Посмотреть сообщение
Речь идет о вызове условного logger->log(...) после удаления объекта а не о фиксации наносекунд
Я ничего ни о каких наносекундах не писала.

Я писала о том, что объект сам не сможет выполнить:
Цитата Сообщение от Undisputed Посмотреть сообщение
logger->log(...) после удаления объекта
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 13:31
Цитата Сообщение от Optimus11 Посмотреть сообщение
Возможно я понял, что вы имели ввиду.
Вообщем я сделаю в данном классе Task метод, которые примет на вход колбек или лямбду, которая будет вызыватся обьектом класса при каждом добавлении и удалении задачи, а Пользователь класса сам решит, что с этой информацией делать и куда заносить.
Ну вот, теперь вы немного приблизились к правильному решению

Только менять нужно не сам Task, а некоторый менеджер задач (контейнер задач). Аналогия такая: есть например тип int, и есть контейнер этого типа который реализует работу по списком этого типа (как например тот же std::list<int>). Вы ведь не требуете, что бы внутри int была реализация удаления этого int из std::list. Все действия связанные с добавлением/удалением и т.д реализует сам контейнер и управляется вне типа который используется в качестве типа элемента контейнера. Такой подход например позволяет использовать тип с разными контейнерами, интерфейсы которых отличаются. Вопросы остались ?

Добавлено через 2 минуты
Цитата Сообщение от eva2326 Посмотреть сообщение
Я писала о том, что объект сам не сможет выполнить:
Может
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct task
{
    // ...
    void run()
    {
        m_fn();
        // задача завершена, пора логировать
        m_logger->log(...);
    }
    // ...
    std::function<...> m_fn;
};
Уточню, что так делать не нужно ) Но возможность такая есть
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
10.04.2024, 13:32  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
Ну вот, теперь вы немного приблизились к правильному решению

Только менять нужно не сам Task, а некоторый менеджер задач (контейнер задач). Аналогия такая: есть например тип int, и есть контейнер этого типа который реализует работу по списком этого типа (как например тот же std::list<int>). Вы ведь не требуете, что бы внутри int была реализация удаления этого int из std::list. Все действия связанные с добавлением/удалением и т.д реализует сам контейнер и управляется вне типа который используется в качестве типа элемента контейнера. Такой подход например позволяет использовать тип с разными контейнерами, интерфейсы которых отличаются. Вопросы остались ?
У меня класс Task и условный менеджер задач - это одно и тоже.
А очередьь состоит из std::function<void()> - что позволяет поместить в нее задачу любого типа. Хоть на примем данных с сервера, хоть рендер кадра.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
10.04.2024, 13:35
Цитата Сообщение от Undisputed Посмотреть сообщение
Может
Чушь.

Вы зафиксировали время:
Цитата Сообщение от eva2326 Посмотреть сообщение
объекты отчитываются в том, что они по факту уже выполнили какие то возложенные на них задачи
А вовсе не время:
Цитата Сообщение от Undisputed Посмотреть сообщение
удаление

Вот здесь вы фиксируете время завершения задачи, а не время когда задача была удалена:
Цитата Сообщение от Undisputed Посмотреть сообщение
// задача завершена, пора логировать
        m_logger->log(...);
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 13:40
Цитата Сообщение от eva2326 Посмотреть сообщение
а не время когда задача была удалена
а говорили что не считаете наносенкунды...
Цитата Сообщение от eva2326 Посмотреть сообщение
Чушь.
ок

Добавлено через 2 минуты
Цитата Сообщение от Optimus11 Посмотреть сообщение
У меня класс Task и условный менеджер задач - это одно и тоже.
не должно быть так... возвращаю вас к примеру с list<int>
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
10.04.2024, 13:40  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
а говорили что не считаете наносенкунды...

ок
Если я правильно понял, Eva имеет ввиду, что есди задача вызывает не интефейс обьекта класса, а удаляет себя физически сама, то есть условно через переданный в задачу указатель на контейнер в котором находится задача и сам указатель на элемент контейнера в котором эта задача находится, то при прямом вызове .erase(iterator) - функция логирования не вызовется.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
10.04.2024, 13:40
Цитата Сообщение от Undisputed Посмотреть сообщение
а говорили что не считаете наносенкунды
Я нигде ни о каких наносекундах не писала.

Я писала о том, что:
Цитата Сообщение от Undisputed Посмотреть сообщение
logger->log(...) после удаления объекта
Можно выполнить только после удаления объекта

Такое впечатление, что вы не различаете понятия: "объект удален" и "объект выполнил свою бизнес-логику"
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
10.04.2024, 13:42  [ТС]
Цитата Сообщение от Undisputed Посмотреть сообщение
а говорили что не считаете наносенкунды...

ок

Добавлено через 2 минуты

не должно быть так... возвращаю вас к примеру с list<int>
У меня класс задачи не щаблонный класс, которому можно "назначит" тип обьекта.
Меня std::list<std::function<void()>> или std::deque<std::function<void()>> как контенер для задачи вполне устраивает. ПО крайней мере на данный момент.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
10.04.2024, 13:49
eva2326,
ну можно удалить объект а потом уже логировать, у меня в коде вообще нет удаления.. если надо можно добавить удаление и после него сразу логирование... не считаю эту деталь принципиальной.. не в этом была суть. ТС понял что я ему хотел сказать, а флудить по незначительным деталям в рамках которых есть место различной интерпретации у меня нет желания.

Добавлено через 2 минуты
Цитата Сообщение от Optimus11 Посмотреть сообщение
У меня класс задачи не щаблонный класс, которому можно "назначит" тип обьекта.
Речь о том, что бы разделить понятия контейнер и элемент и таким образом сделать архитектуру более естественной и гибкой. Это делается не сложнее чем то что у вас есть, за-то решение получается более гибким и легким для понимания. Если в общем непонятно то могу расписать подробнее
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,517
10.04.2024, 13:58
Цитата Сообщение от Undisputed Посмотреть сообщение
можно удалить объект а потом уже логировать
Тогда это уже не будет фиксацией времени само-удаления.

Выше шла речь о том, что бы объект залоггировал время собственного удаления.
А это принципиально невозможно.

Цитата Сообщение от Undisputed Посмотреть сообщение
не считаю эту деталь принципиальной.. не в этом была суть.
Суть в том, что бы называть вещи своими именами и не путаться в понятиях.
И не путать себя и других.

Событие "завершение задачи" и событие "удаление объекта, связанного с задачей" - это принципиально разные события.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.04.2024, 13:58
Помогаю со студенческими работами здесь

std::priority_queue - очередь с приоритетом
Здравствуйте, Подскажите пожалуйста, как работает std::priority_queue внутри ? То есть я понимаю, что это некий адаптер к...

std::list
Здравствуйте, создал двумерный list. Подскажите, пожалуйста, как записать в него элементы. Допустим, хочу добавить во второй список один...

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int')
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...

Сортировка std::list
Есть такой фрагмент програми. Создаю функцию для сортировки list. Вроде все правильно. В класе перегружены оператори &lt; i =. Не знаю что...

Static std::list
Добрый день, помогите решить проблему. &quot;Каждое статическое поле должно быть проинициализировано до main() явным образом&quot; - как я...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru