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

时间:2016-05-17 00:02:33

标签: 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);
}

有效。但是,size_t返回的size()difference_type返回的distance()的符号不同。

 warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

std::distance可能会根据迭代器的方向返回负数。

如果是这种情况,当元素数量超过有符号最大值时,如何可靠地获得两个迭代器之间的元素总数?我正在寻找像std::size这样的东西,但它需要一个完整的容器。

1 个答案:

答案 0 :(得分: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();
}