Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > MRU list на std::list


Автор: mrgloom 17.4.2012, 09:44
надо реализовать MRU list, хорошая ли это идея делать это на std::list ?

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

возможно у кого то есть что то уже готовое.

Добавлено через 1 минуту и 38 секунд
+ наверно надо его лочить при каких либо его изменениях, как это можно сделать прямо в классе?

Автор: azesmcar 17.4.2012, 09:49
Цитата(mrgloom @  17.4.2012,  09:44 Найти цитируемый пост)
надо реализовать MRU list, хорошая ли это идея делать это на std::list?

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

Цитата(mrgloom @  17.4.2012,  09:44 Найти цитируемый пост)
+ наверно надо его лочить при каких либо его изменениях, как это можно сделать прямо в классе? 

Зачем? Доступ происходит из нескольких потоков?

Автор: mrgloom 17.4.2012, 10:06
Цитата(azesmcar @  17.4.2012,  09:49 Найти цитируемый пост)
Зачем? Доступ происходит из нескольких потоков? 


да.


я не понимаю лок должен быть какого то типа? специальный для класса или для треда? или вообще можно булевскую переменную?

Автор: azesmcar 17.4.2012, 10:40
Цитата(mrgloom @  17.4.2012,  10:06 Найти цитируемый пост)
я не понимаю лок должен быть какого то типа?

boost::mutex, std::mutex, critical section.

Цитата(mrgloom @  17.4.2012,  10:06 Найти цитируемый пост)
специальный для класса или для треда?

Для объекта.

Цитата(mrgloom @  17.4.2012,  10:06 Найти цитируемый пост)
или вообще можно булевскую переменную?

Нет. Можно разве что с помощью атомарных операций с этой переменной, тогда получится обыкновенный http://en.wikipedia.org/wiki/Spinlock, но это не самая лучшая идея. Если есть компилятор с поддержкой нового стандарта, то используй std::mutex, если нет, но есть boost - бери boost::mutex, если и этого нет, но платформа windows - тогда http://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx, если платформа *nix - тогда pthread_mutex. Также есть решения в Qt.

Автор: volatile 17.4.2012, 13:31
В бусте я где-то видел готовое решение для быстрого (индексированного) MRU-списка.

Добавлено через 2 минуты и 16 секунд
А вот нашёл:
http://www.boost.org/doc/libs/1_41_0/libs/multi_index/example/serialization.cpp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)