2016-12-28 13 views

ответ

6

Поскольку std::unique изменяет (путем смещения) элементы в диапазоне [первый, последний], передаваемый путем назначения перемещения. Это означает, что требуется, чтобы тип разыменованного итератора соответствовал требованиям MoveAssignable.

требования Тип

  • ForwardIt должны соответствовать требованиям ForwardIterator.
  • Тип разыменованного ForwardIt должен отвечать требованиям MoveAssignable.

Но итераторная std::multiset является сопзЬ итератор (с C++ 11), которая не соответствует требованиям. Элемент отложенного элемента не может быть назначен через них.

+0

Я ищу [здесь] (http://en.cppreference.com/w/cpp/container/multiset) и pre-C++ 11 'iterator' не был постоянным. Как это работает? – LogicStuff

+1

@LogicStuff pre-C++ 11 порядок элементов может быть изменен, поэтому вы можете применить 'std :: unique' – paweldac

+0

@LogicStuff. Если моя память верна, pre C++ 11, стандарт не достаточно ясен об этом ; некоторые имплантации позволяют это, некоторые нет. – songyuanyao

2

std::multiset является внутренне отсортированным контейнером, std::unique изменяет элементы в контейнере. std::unique использует container::iterator_type в своих реализациях и из-за того, что структура std::multiset является строгой, она имеет только const_iterator_type. Поэтому std::unique не может быть применен к типу std::multiset.

Перед внедрением C++ 11 внутренняя структура std::multimap может быть изменена, поэтому std::unique может применяться на таком контейнере.

2

std::unique не удаляет повторяющиеся значения из диапазона. Вместо этого он перемещает их до конца диапазона (путем замены двух элементов во входной последовательности). В std::multiset и других ассоциативных контейнерах порядок элементов определяется предикатом сортировки и не может быть изменен пользователем. Это ограничение достигается за счет того, что неконстантный итератор std::multiset несколько похож на его const_iterator (т. Е. Вы не можете изменить элемент std::multiset через его неконстантный итератор).