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

3

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

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 的东西,但它需要整个容器。


1
当元素数量超过有符号最大值时,我在现实世界中还没有看到这种情况发生。在64位系统上,不会出现这种情况。 - Baum mit Augen
此外,在这里,输入迭代器不够强大,递增一个无效化所有副本。你至少需要前向迭代器。 - Baum mit Augen
由于距离计算的是元素而不是字节,因此在32位系统上也不会发生这种情况。 - MikeMB
@MikeMB:有些代码使用了vector<char>(甚至是臭名昭著的vector<bool>)。 - Tony Delroy
1
@MikeMB 从技术上讲,一个vector<char>理论上可以占用超过一半的总内存。但是,你上次遇到这种情况是什么时候呢?(vector<bool>甚至可能“溢出”size_t!我们生活在一个多么可怕的世界啊。) - Baum mit Augen
显示剩余8条评论
1个回答

1
如果是这种情况,当元素数量超过有符号最大值时,我如何可靠地获取两个迭代器之间的元素总数呢?
如果你处理这么多元素,你真的想每次调用函数时都将它复制到一个集合中吗?
我会建议你将容器作为引用传递,并替换原始方法:
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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接