我编写了一个函数来测试容器中的所有元素是否唯一。
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()
返回的size_t
和从distance()
返回的difference_type
不具有相同的符号
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
std::distance可能会根据迭代器的方向返回负数。
如果是这样的话,当元素数量超过有符号的最大值时,我如何可靠地获得两个迭代器之间的元素总数?我在找类似std::size的东西,但它需要整个容器。
如果是这样的话,当元素数量超过有符号的最大值时,我如何可靠地获得两个迭代器之间的元素总数?
如果你要处理这么多元素,你真的想每次调用函数时都把它复制到一个集合中吗?
我要么把你的容器作为参考,要么用你原来的方法代替:
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();
}