Я написал функцию для проверки того, что все элементы в контейнере уникальны.
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]
станд :: расстояние может возвращать отрицательные числа в зависимости от направления итераторов.
Если это так, как я могу надежно получить общее количество элементов между двумя итераторами, когда количество элементов превышает подписанный максимум? Я искал что-то вроде станд :: размер, но это займет целый контейнер.
Если это так, как я могу надежно получить общее количество элементов между двумя итераторами, когда количество элементов превышает подписанный максимум?
Если вы имеете дело с таким количеством элементов, действительно ли вы хотите копировать его в набор каждый раз, когда вызываете функцию?
Я бы либо передал ваш контейнер в качестве ссылки, либо заменил бы ваш оригинальный метод:
template<class Container>
bool all_elements_unique(Container& c) {
std::set<typename Container::value_type> s(std::begin(c), std::end(c));
return s.size() == c.size();
}
Или сделать сортировку и adjacent_find
:
template<class Container>
bool all_elements_unique(Container& c) {
std::sort(c.begin(), c.end());
return std::adjacent_find(c.begin(), c.end()) == c.end();
}
Других решений пока нет …