【问题标题】:How can I get the total number of elements between two iterators?如何获得两个迭代器之间的元素总数?
【发布时间】:2016-05-17 00:02:33
【问题描述】:

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

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

【问题讨论】:

  • “当元素的数量超过有符号的最大值时?” 我还没有看到现实世界中发生这种情况。在 64 位系统上,它不会。
  • 另外,这里的输入迭代器不够强大,加一会使所有副本无效。你至少需要前向迭代器。
  • 距离计算元素,而不是字节。它也不会发生在 32 位系统上。
  • @MikeMB:一些代码使用了vector&lt;char&gt;(甚至是臭名昭著的vector&lt;bool&gt;)。
  • @MikeMB 从技术上讲,一个vector&lt;char&gt; 可以吃掉总内存的一半以上。但是,是的,你最后一次吃这个是什么时候? (vector&lt;bool&gt; 甚至可以“溢出”size_t!我们生活的世界多么可怕。)

标签: c++ stl iterator containers iterator-traits


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多