Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
1

Какой STL-контейнер выбрать?

30.01.2014, 21:02. Показов 2162. Ответов 12
Метки нет (Все метки)

Приветствую!
Мне нужно выбрать STL-контейнер (C++11), для хранения элементов по ключу.
Типа ключа - std::string, элемент - указатель на абстрактный объект.
На один ключ один элемент, т.е, не multi-container.

Основная операция - range-based for loop. (for (Element* e : m_elements) )
Очень редко будет использоваться - вставление элемента, почти никогда - получение элемента.

Какой контейнер мне выбрать? (самый оптимальный)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2014, 21:02
Ответы с готовыми решениями:

Какой контейнер STL выбрать?
Во входном потоке (FILE*) дано множество точек. Найти пару точек, расстояние между которыми...

Какой контейнер в STL и для чего эффективнее использовать?
Какой контейнер в STL и для чего эффективнее использовать? И почему

Какой контейнер выбрать?
Добрый день. Подскажите, какой контейнер стоит выбрать? Пара ключ-значение, отдельно. Значение...

Какой контейнер выбрать?
Доброго времени суток, Господа. Такая есть задача. Есть объект Scene, который является...

12
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
30.01.2014, 21:14 2
valval, map или unordered_map, можно еще set или unordered_set
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
30.01.2014, 21:45  [ТС] 3
Цитата Сообщение от metaluga145 Посмотреть сообщение
valval, map или unordered_map, можно еще set или unordered_set
Ну они разные, какой под мою ситуацию подходит?
Чтобы был быстрый перебор элементов.
0
DU
1495 / 1141 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
30.01.2014, 22:24 4
еще пара вариантов:
сортированный std::vector<std:: pair<Key, Value>> - хорошо для перебора, плохо для вставки.
сортированный std::deque<std:: pair<Key, Value>> - чуть хуже с перебором чем у вектора, вставка - лучше чем у вектора. позиции для вставки нужно будет искать каким-нибудь std::lower_bound или похожим, иначе вставка с последующей сортировкой, что не очень быстро.
0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
30.01.2014, 22:27 5
Range-based for - это перебор через итератор. Т.е. такой же как и обычный перебор через итератор в цикле.
std::set можно сразу отбросить, т.к. по критериям отбора он явно подходит не лучше чем std::map.
Остаётся std::map и std::unordered_map...

Цитата Сообщение от valval Посмотреть сообщение
Основная операция - range-based for loop. (for (Element* e : m_elements) )
Очень редко будет использоваться - вставление элемента, почти никогда - получение элемента.
А основная операция (range-based for) как часто будет использоваться?
0
Форумчанин
Эксперт CЭксперт С++
8170 / 5020 / 1436
Регистрация: 29.11.2010
Сообщений: 13,453
30.01.2014, 22:32 6
std::unordered_map, но учесть, что последовательность может быть нарушена. Если оно важно, то
C++
1
std::vector<std::pair<std::string, Class*>>
Добавлено через 2 минуты
Но это если вставка будет производится чаще всего в конец.
Тут необходимо уточнение: как часто вставлять будете и куда, насколько часто нужен доступ к элементам и к каким конкретно?
1
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
30.01.2014, 22:58  [ТС] 7
- Не важен порядок
- Вставка будет только при инициализации "мира"
- Иттерация всех элементов будет очень проходить очень часто.
- Доступ к объекту по ключу - думаю никода.
0
243 / 244 / 38
Регистрация: 08.04.2013
Сообщений: 927
30.01.2014, 23:01 8
Цитата Сообщение от valval Посмотреть сообщение
Доступ к объекту по ключу - думаю никода.
а зачем тогда вообще ключ? используйте просто вектор тогда)
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
30.01.2014, 23:05  [ТС] 9
Цитата Сообщение от metaluga145 Посмотреть сообщение
а зачем тогда вообще ключ? используйте просто вектор тогда)
Все же нужен ключ, мало ли вдруг что изменится, и придется после этого долго отрефакторивать всё.
0
1454 / 791 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
31.01.2014, 01:12 10
Лучший ответ Сообщение было отмечено как решение

Решение

Картинка с хабра в тему:
Миниатюры
Какой STL-контейнер выбрать?  
8
78 / 78 / 9
Регистрация: 26.12.2011
Сообщений: 217
31.01.2014, 01:30 11
Цитата Сообщение от valval Посмотреть сообщение
Иттерация всех элементов будет очень проходить очень часто.
У std::list, кстати, в отличие от других контейнеров, такие операции проходят за константное время, а не за O(log(n)). Схожа с ним и std::deque.
Остальные контейнеры не удовлетворяют этому критерию.
IMHO.
0
1 / 1 / 0
Регистрация: 29.01.2014
Сообщений: 30
03.02.2014, 04:01  [ТС] 12
Цитата Сообщение от DiffEreD Посмотреть сообщение
Картинка с хабра в тему:
Эту картинку я видел давно, но там про итерацию не слова.
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
03.02.2014, 13:46 13
valval, я бы взял вектор пар, быстрее для обхода всех элементов сложно что-то придумать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2014, 13:46

Какой контейнер выбрать для символов?
Добрый день, уважаемые коллеги вопрос. Нужно в массив vector по буквам записывать текст из файла...

Какой ассоциативный контейнер выбрать? И как реализовать в нем чтение из файла?
Вот сама задание: Текстовый файл содержит следующую информацию: координату точки и угол наклона...

Какой контейнер выбрать (Нужен массив, с возможностью добавления и удаления элементов)?
Привет, народ! Посоветуйте, что лучше использовать. В моей задаче нужен массив, с возможностью...

STL, контейнер set
Помогите, пожалуйста. Задание состоит вот в чем: даны названия городов, и для них перечислены...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.