STL - Использовать функции-члены или функции в <algorithm>? - PullRequest
4 голосов
/ 11 ноября 2010

Я подумал об этой проблеме из-за некоторых ответов, которые я получил на следующую проблему, предполагая, что я могу использовать vector<T>::assign или copy с back_insert_iterator здесь. Моя проблема в том, чтоКаковы недостатки и преимущества использования одного метода перед другим?

Ответы [ 5 ]

5 голосов
/ 11 ноября 2010

assign перезаписывает содержимое vector, где copy с back_insert_iterator делает push_back для вектора, таким образом сохраняя его содержимое.

РЕДАКТИРОВАТЬ : Если вопрос является общим (то есть использовать ли функцию-член, определенную в контейнере или алгоритме), я предпочитаю использовать функцию-член, так как она могла бы быть оптимизирована для конкретного контейнера. по сравнению с универсальным алгоритмом.

2 голосов
/ 11 ноября 2010

В общем случае предпочитайте функции-члены функционально-эквивалентным алгоритмам.Скотт Мейерс подробно обсуждает это в Effective STL .

2 голосов
/ 11 ноября 2010

Дополнение Ответ Навина , использование std::copy() также гораздо более универсально, так как таким образом вы можете легко написать любой выходной итератор.Это может быть поток или что-то совершенно другое.

1 голос
/ 11 ноября 2010

Ваш вопрос можно обобщить следующим образом:

При работе с контейнерами STL, я предпочитаю использовать функции-члены или автономные функции из <algorithm>, когда существуют функциональные эквиваленты?

Спросите 10 программистов, и вы получите 12 ответов.Но они попадают в 2 основных лагеря:

1) Предпочитают функции членов.Они разработаны специально для рассматриваемого контейнера и более эффективны, чем эквивалент <algorithm>.

2) Предпочитают отдельно стоящие функции.Они более универсальны, и их использование легче поддерживать.

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

Но если вы просто хотите слепо следовать чьему-то совету, вот мой: предпочтите автономные функции.Да, они могут быть медленнее, чем функции-члены.И "медленный" - это такое грязное слово.Но 9 раз из 10 вас просто не волнует (или не должно волновать), насколько эффективнее один метод, чем другой.Большую часть времени, когда вам нужна коллекция, вы будете периодически добавлять несколько элементов, что-то делать, а затем делать.Иногда вам нужен сверхвысокопроизводительный поиск, вставка или удаление, но не всегда.Так что, если вы собираетесь спускаться с одной или другой стороны с помощью подхода «Предпочитаемый метод X», он должен быть ориентирован на случай general .И подход, который предпочитает методы-члены, кажется, склонен к оптимизации - и я называю это преждевременной микрооптимизацией.

1 голос
/ 11 ноября 2010

По сути, они одинаковы. Поведение вектора перераспределения (определяемое с точки зрения его поведения с помощью push_back) позволяет избежать слишком большого количества перераспределений за счет постепенного использования большего количества памяти.

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

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

И просто для полноты, copy + back_inserter эквивалентен vector :: insert в конце (), а vector :: clear + copy + back_inserter эквивалентен vector :: assign.

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