Как я могу получить общее количество элементов между двумя итераторами?

Я написал функцию для проверки того, что все элементы в контейнере уникальны.

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]

станд :: расстояние может возвращать отрицательные числа в зависимости от направления итераторов.

Если это так, как я могу надежно получить общее количество элементов между двумя итераторами, когда количество элементов превышает подписанный максимум? Я искал что-то вроде станд :: размер, но это займет целый контейнер.

2

Решение

Если это так, как я могу надежно получить общее количество элементов между двумя итераторами, когда количество элементов превышает подписанный максимум?

Если вы имеете дело с таким количеством элементов, действительно ли вы хотите копировать его в набор каждый раз, когда вызываете функцию?

Я бы либо передал ваш контейнер в качестве ссылки, либо заменил бы ваш оригинальный метод:

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();
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]