2016-05-17 7 views
2

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

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, но для этого требуется целый контейнер.

+1

* ", когда количество элементов превышает подписанный максимум? »* Мне еще предстоит увидеть, что это происходит в реальном мире. В 64-битных системах этого не произойдет. –

+0

Кроме того, Input Iterator здесь недостаточно силен, приращение одного отменяет все копии. Вам нужен хотя бы итератор. –

+0

И как расстояние подсчитывает элементы, а не байты. Это также не произойдет в 32-битной системе. – MikeMB

ответ

0

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

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

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

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(); 
} 
Смежные вопросы