C++ 如何获得两个迭代器之间的元素总数?

C++ 如何获得两个迭代器之间的元素总数?,c++,stl,iterator,containers,iterator-traits,C++,Stl,Iterator,Containers,Iterator Traits,我编写了一个函数来测试容器中的所有元素是否唯一 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); }

我编写了一个函数来测试容器中的所有元素是否唯一

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);
}
可以根据迭代器的方向返回负数

如果是这样的话,当元素数量超过有符号最大值时,如何可靠地获得两个迭代器之间的元素总数?我在找类似的东西,但它需要一个完整的容器

如果是这样的话,当元素数量超过有符号最大值时,如何可靠地获得两个迭代器之间的元素总数

如果要处理这么多元素,是否真的希望每次调用函数时都将其复制到集合中

我会将您的容器作为参考传递,或者替换为您的原始方法:

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

“当元素的数量超过有符号的最大值时?”我还没有看到这种情况在现实世界中发生。在64位系统上,它不会。此外,这里的输入迭代器不够强,增加1会使所有副本无效。您至少需要一个前向迭代器。而且,距离计算的是元素,而不是字节。它也不会发生在32位系统上。@MikeMB:有些代码使用
向量
(甚至是臭名昭著的
向量
)。@MikeMB从技术上讲,一个
向量
,占用了总RAM的一半以上。但是是的,你最后一次吃这个是什么时候?(向量甚至可能“溢出”
size\u t
!我们生活在一个多么可怕的世界。)
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();
}
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();
}