Я написал функцию, чтобы проверить, что все элементы в контейнере уникальны.Как я могу получить общее количество элементов между двумя итераторами?
template<class InputIt>
bool all_elements_unique(InputIt first, InputIt last){
std::set<typename std::iterator_traits<InputIt>::value_type> s(first,last);
return s.size() == std::distance(first,last);
}
Это работает. Однако size_t
вернулся с size()
и difference_type
, возвращенный с distance()
, не имеет одного знака.
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
std::distance может возвращать отрицательные числа, основанные на направлении итераторы.
Если это так, как я могу надежно получить общее количество элементов между двумя итераторами, когда количество элементов превышает подписанный максимум? Я искал что-то вроде std::size, но для этого требуется целый контейнер.
* ", когда количество элементов превышает подписанный максимум? »* Мне еще предстоит увидеть, что это происходит в реальном мире. В 64-битных системах этого не произойдет. –
Кроме того, Input Iterator здесь недостаточно силен, приращение одного отменяет все копии. Вам нужен хотя бы итератор. –
И как расстояние подсчитывает элементы, а не байты. Это также не произойдет в 32-битной системе. – MikeMB