Выбор контейнера C ++ / выбор - PullRequest
1 голос
/ 22 июня 2011

Существует множество дискуссий на StackOverflow и других сайтах о том, какой тип контейнера C ++ использовать, с не столь шокирующим выводом «это зависит от ваших потребностей».

В настоящее время я использую std ::list на моих интерфейсах, однако у меня нет прямого требования к спискам, в отличие от векторов или запросов;и в этом заключается мой вопрос.

Я не могу сказать, каковы будут мои требования.Сегодня это список, завтра ... кто знает?

Я играю над идеей создания класса-обёртки 'Collection', который не делает ничего, кроме как представляет интерфейс контейнеров STL, позволяющий мне изменять внутренние компоненты.без необходимости ломать мои интерфейсы.

Стоит ли это хлопот?Должен ли я просто смириться с этим и принять решение о моих текущих потребностях?

Есть какие-либо мнения?

Приветствия, Бен

РЕДАКТИРОВАТЬ:

Безопасность потокаважно.

Перекомпиляция кода, потребляющего интерфейс, недопустима.

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

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

Не создавайте класс, который вы используете, просто потому, что вы не понимаете разные контейнеры, потому что это пустая трата ресурсов.В таком случае вы должны узнать больше о нескольких основных типах контейнеров, таких как список, вектор, очередь, возможно, карта и использовать их, когда они необходимы.Единственная причина, по которой их так много, состоит в том, что в разных ситуациях требуются разные контейнеры для упрощения программирования и повышения эффективности кода.Например, списки хороши, если вы помещаете и удаляете много, а вектор быстрее, если вы читаете больше.Очереди хороши, когда есть необходимость делать вещи в точном порядке (кстати, значение priority_queue такое же, за исключением того, что вы можете использовать определенный порядок), карты хороши для хеширования текущего состояния или чего-то подобного.

2 голосов
/ 22 июня 2011

Вы должны написать свой код в общем. Но вместо определения универсального Container, используйте STL способ отделения алгоритмов от контейнеров (итераторов). Поскольку вы хотите связать динамически, прочитайте эту статью , и вы можете найти некоторые вещи в boost (any_range ...).

0 голосов
/ 22 июня 2011

Если вам нужен один контейнер и вы хотите быстро изменить его тип, используйте typedef в соответствии с рекомендациями @ icabod.

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

Только если вам нужно выбрать тип контейнера во время выполнения, вы должны реализовать полиморфные Container или Collection class + подклассы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...