почему нет + = оператор для векторов в STL - PullRequest
3 голосов
/ 22 марта 2010

Мне любопытно? Какую логику высокого уровня уходит за неосуществлением:

result+=vector1;

, где и result, и vector1 являются векторами stl.

Примечание: я знаю, как реализовать этот бит, но мне нужно знать, какую логику использовали мудрецы, разработавшие STL, когда они решили не реализовывать эту функцию?

Ответы [ 4 ]

17 голосов
/ 22 марта 2010

Что вы ожидаете, что result будет содержать результат объединения result с vector1 или поэлементного += (что бы это ни значило для базовых типов), возможно, инициализирующих по умолчанию членов, если размеры не совпадают?

И да, это ответ;).

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

Обратите внимание, что valarray имеет больше перегрузок операторов, чем vector из-за его интерфейса и предполагаемого использования.

3 голосов
/ 22 марта 2010

Я думаю, что оператор не перегружен, потому что его значение неоднозначно.Вы хотите добавить векторы?result.insert( result.end(), vector1.begin(), vector1.end() ) выполняет это.

2 голосов
/ 22 марта 2010

Мой взгляд на вещи (основанный, в значительной степени на элементах программирования ) заключается в том, что Степанов считает контейнеры существенно менее важными, чем алгоритмы и итераторы. С его точки зрения, алгоритмы являются наиболее важной частью. Итераторы являются вторичными, а контейнеры - это просто хранилище, необходимое для работы итераторов.

В книге он начинает с некоторых основ, таких как объекты и преобразования. Глава шестая посвящена, прежде всего, итераторам (фактически «Итераторы» - это название главы). Это также имеет почти единственное упоминание о контейнерах в книге:

Существует четыре вида линейных Обход: однопроходной вперед ( входной поток), многопроходный вперед ( односвязный список), двунаправленный ( двусвязный список) и произвольный доступ (массив).

Единственное другое место, которое я помню, он вообще упоминал контейнеры - это указание на то, что определенный тип («линеаризуемый») не является контейнером, потому что ему не принадлежит его содержимое.

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

0 голосов
/ 24 марта 2010

Библиотека Boost.Assignment фактически добавляет оператор += к std::vector и другим контейнерам.

http://www.boost.org/doc/libs/1_42_0/libs/assign/doc/index.html

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