Я написал функцию для проверки уникальности всех элементов в контейнере.
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, но он занимает целый контейнер .
vector<char>
(или даже пресловутыйvector<bool>
). - person Tony Delroy   schedule 17.05.2016vector<bool>::iterator
передает привет :) - person T.C.   schedule 17.05.2016vector<char>
, который потребляет более половины всей оперативной памяти. Но да, когда это было в последний раз? (vector<bool>
может даже переполнитьsize_t
! В каком страшном мире мы живем.) - person Baum mit Augen   schedule 17.05.2016static_cast<>
и двигаться дальше звучит разумно, или вы циклически выполняете и подсчитываете наборы вставок. Если вы хотите пофантазировать, вы можете создать вспомогательный тип оболочки, который подсчитывает количество инкрементов содержащегося/управляемого итератора, поэтому конструкторset
случайно вычисляет расстояние. (Вам также нужно будет обернуть итераторlast
при его предоставлении, чтобы они были одного типа, но не было бы итераций с использованием дополнительного счетчика). - person Tony Delroy   schedule 17.05.2016sizeof(T) == 1
, вы можете сделать вывод, что не все элементы уникальны, если исходный размер больше256
, поэтому вы можете проверить это перед вызовом вышеуказанной функции, если вы супер параноик. - person Baum mit Augen   schedule 17.05.2016