Контейнерный доступ и распределение через одного и того же оператора? - PullRequest
2 голосов
/ 01 февраля 2010

Я создал контейнер для общих данных слабого типа, который доступен через оператор индекса.

Контейнер std::map допускает как доступ к данным, так и вставку элементов через оператора, тогда как std::vector Я думаю, что нет.

Каков наилучший способ (стиль C ++)? Должен ли я разрешить размещение с помощью оператора индекса или использовать отдельный метод вставки?

EDIT

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

Ответы [ 3 ]

2 голосов
/ 01 февраля 2010

В случае Векторов: Нижняя запись не вставляется - она ​​перезаписывается.

Остальная часть этого поста содержит информацию из пунктов 1-5 из Effective STL .

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

Однако в общем случае вставки векторов имеют такие значения, как смещение элементов вверх и удвоение памяти при исчерпании (что вызывает поток копий из объектов старого вектора в места в новом векторе), когда вы делаете ad hoc вставок. Векторы предназначены для тех случаев, когда вам известны характеристики местности ваших данных ..

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

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

1 голос
/ 01 февраля 2010

это зависит от того, что вы хотите. Карта может быть значительно медленнее, чем вектор, если вы хотите использовать такую ​​вещь, как массив. Карта очень полезна, если индекс, который вы хотите использовать, не является последовательным, и у вас есть НАГРУЗКИ из них. Обычно быстрее использовать вектор, отсортировать его и выполнить бинарный поиск, чтобы найти то, что вам нужно. Я использовал этот метод для замены карт в тоннах программного обеспечения, и я до сих пор не нашел что-то, где было бы медленнее сделать это с вектором.

Итак, IMO, std :: vector - лучший способ, хотя карта МОЖЕТ быть полезной, если вы используете ее правильно.

0 голосов
/ 01 февраля 2010

Раздельный метод вставки, определенно. operator[] на std::map просто глупо и затрудняет чтение и отладку кода. Также вы не можете получить доступ к данным из контекста const, если вы используете operator[] для вставки (что приведет к un-const-Cancer , еще более злому кузену const -cancer ).

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