如何获得两个迭代器之间的元素总数?
How can I get the total number of elements between two iterators?
我编写了一个函数来测试容器中的所有元素是否都是唯一的。
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
return 和 distance()
的 difference_type
return 不是同一个符号。
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
std::distance 可能 return 负数基于迭代器的方向。
如果是这样的话,当元素的数量超过有符号的最大值时,我如何才能可靠地获得两个迭代器之间的元素总数?我一直在寻找类似 std::size 的东西,但它需要整个容器。
If that's the case, how could I reliably get the total number of elements between two iterators, when the amount of elements exceeds the signed maximum?
如果您要处理那么多元素,您真的希望每次调用该函数时都将其复制到一个集合中吗?
我要么将您的容器作为参考传递,要么替换为您的原始方法:
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();
}
我编写了一个函数来测试容器中的所有元素是否都是唯一的。
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
return 和 distance()
的 difference_type
return 不是同一个符号。
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
std::distance 可能 return 负数基于迭代器的方向。
如果是这样的话,当元素的数量超过有符号的最大值时,我如何才能可靠地获得两个迭代器之间的元素总数?我一直在寻找类似 std::size 的东西,但它需要整个容器。
If that's the case, how could I reliably get the total number of elements between two iterators, when the amount of elements exceeds the signed maximum?
如果您要处理那么多元素,您真的希望每次调用该函数时都将其复制到一个集合中吗?
我要么将您的容器作为参考传递,要么替换为您的原始方法:
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();
}