【发布时间】: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<char>(甚至是臭名昭著的vector<bool>)。 -
@MikeMB 从技术上讲,一个
vector<char>可以吃掉总内存的一半以上。但是,是的,你最后一次吃这个是什么时候? (vector<bool>甚至可以“溢出”size_t!我们生活的世界多么可怕。)
标签: c++ stl iterator containers iterator-traits