Почему std :: unique не вызывает std :: sort? - PullRequest
1 голос
/ 14 июля 2020

Библиотечный алгоритм std :: unique в C ++ 11 может использоваться для переупорядочивания входного диапазона контейнера, чтобы исключить смежные повторяющиеся записи, и возвращает итератор, который обозначает конец диапазона уникальных значений. Это означает, что если мы хотим применить это к контейнеру, нам сначала нужно будет вызвать std :: sort, затем std :: unique и fini sh с std :: erase, как в следующем примере:

// sort words (vector<string>) alphabetically so we can find the duplicates 
sort(words.begin(), words.end());

// unique reorders the input range so that each word appears once in the
// front portion of the range and returns ab iterator one past the unique range
auto end_unique = unique(words.begin(), words.end());

// erase uses a vector operation to remove the non-unique elements
words.erase(end_unique, words.end());

Мой вопрос: в чем причина того, что std :: unique не вызывает std :: sort? Спасибо!

1 Ответ

3 голосов
/ 14 июля 2020

в чем причина того, что std :: unique не вызывает std :: sort?

Потому что это избыточно и неэффективно, если входной контейнер уже был отсортирован.

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

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

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