Почему у map есть оператор [], а в set нет? - PullRequest
4 голосов
/ 25 октября 2019

std::map и std::set кажутся мне очень похожими (но в их использовании и в их описании), поэтому я не понимаю, почему std::set не реализует свою версию operator[]. Я подозреваю, что это связано с тем фактом, что элементы в std::set являются const, но даже тогда почему бы не реализовать operator[], который либо возвращает ссылку const, либо создает новый элемент?

В зависимости от ответа на этот первый вопрос, было бы возможно / хорошая идея создать версию std::set, которая реализует operator[]?

Ответы [ 3 ]

17 голосов
/ 25 октября 2019

Ну, std::map<Key, Val> карты Ключ к Val.

То есть m[key] дает ссылку на val. У вас есть ключ, и вы хотите найти соответствующее значение (или связать значение с этим ключом).

В std::set<Elem> элемент будет иметь свой собственный ключ. Итак, единственное, что вы можете вернуть, это то, что у вас уже есть. Для чего вы будете использовать эту операцию?

Набор не для сопоставления одно с другим - это то, что делает map . Набор предназначен для записи того, принадлежит ли элемент какой-либо коллекции. Таким образом, единственная разумная вещь, чтобы использовать это для проверки, учитывая некоторый элемент, является ли этот элемент членом набора. Мы делаем это с s.find(elem) != s.end() или с c ++ 20, s.contains(elem).

Тот факт, что набор описан как std::set<Key, ...>, может быть источником путаницы - я подозреваю, что это только потому, что этоиспользуется для поиска таким же образом, как и ключ карты.

В принципе, вы можете выбрать характеристику набора как map<Elem, bool>, но если вы не хотите действительно хранить bool (который был бы расточительным), элементсемантика доступа и итератора была бы немного проблематичной. То есть это было бы математически точно и непротиворечиво, но либо расточительно, либо сложно в реализации.

1 голос
/ 25 октября 2019

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

Так как обычные массивы имеют оператор индекса, тогда и карты имеют аналогичный оператор индекса.

С другой стороны, наборы не являются связанными массивами. В наборах ключей указаны их данные. Поэтому возникает вопрос, что должно возвращать выражение типа set[key]? Нет большого смысла возвращать себя и, кроме того, когда возвращаемое значение не может быть изменено.

0 голосов
/ 28 октября 2019

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

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