Интерфейс действительно немного сбивает с толку, потому что он очень похож на std::vector<int>::insert
(например) и все же не дает того же эффекта ...
Для ассоциативных контейнеров, таких как set
,map
и новые unordered_set
и co, вы полностью отказываетесь от контроля над порядком элементов (как видно из итерации по контейнеру).В обмен на эту потерю контроля вы получаете эффективный поиск.
Не имеет смысла внезапно предоставлять вам контроль над вставкой, поскольку это позволит вам сломать инварианты контейнера, и вы потеряетеэффективный поиск, который является причиной использования таких контейнеров в первую очередь.
И, таким образом, insert(It position, value_type&& value)
не вставляется в указанное положение ...
Однако это дает нам некоторое пространстводля оптимизации: при вставке элемента в ассоциативный контейнер необходимо выполнить поиск, чтобы определить, куда вставить этот элемент.Позволяя вам указать подсказку , вы получаете возможность help контейнера ускорить процесс.
Это можно проиллюстрировать на простом примере: предположим, чтоВы получаете элементы, уже отсортированные по какому-либо интерфейсу, поэтому не стоит использовать эту информацию!
template <typename Key, typename Value, typename InputStream>
void insert(std::map<Key, Value>& m, InputStream& s) {
typename std::map<Key, Value>::iterator it = m.begin();
for (; s; ++s) {
it = m.insert(it, *s).first;
}
}
Некоторые элементы могут быть плохо отсортированы, но это не имеет значения, если два последовательных элементав правильном порядке, тогда мы получим, в противном случае ... мы просто будем работать как обычно.