【发布时间】:2018-09-11 14:40:15
【问题描述】:
我正在编写自定义算法,在某些时候它需要获取两个迭代器之间的距离。如果我假设 it1 it2 我可以得到它们之间的正距离(it2 - it1)。这没关系,但是std::distance 和operator- 返回difference_type(在我的情况下)是long long 的别名。如果距离太大而无法放入long long 但可以放入unsigned long long(在我的情况下是size_type 别名)怎么办?
对于这个例子,我还假设long long 是int64_t 和unsigned long long 是uint64_t:
std::string container = ...; // assume enourmous number of characters, like 2^64 - 1024
std::cout << (container.begin() - container.end());
由于operator- 返回difference_type,它不适合2^64 - 1024,由于溢出,它应该打印负数(实际上是任何东西-它是UB)。当然,我可以将其转换回std::string::size_type,但我不能确定以前的未定义行为是否像我假设的那样有效。我该如何处理这样的问题?
【问题讨论】:
-
您不能将距离存储在
difference_type类型的变量中吗?我的意思是您可以使用基于模板的解决方案来涵盖所有情况。 -
在我不那么谦虚的意见中,如果你有这么大的数据集,你需要一个无符号的 64 位整数来表示两个元素之间的“距离”,那么你使用了错误的数据结构或错误的设计。
-
并不是我会有这么多数据。我只想知道可能的解决方案是什么。我不希望我的算法在“大多数情况下”起作用。我可以使用转换保留它,但数据溢出是可行的:/
-
2^64 内存的成本是多少,您的任何客户能否将其专用于您程序中的单个容器?
-
这个问题真的很简单,如果你有C++11编译器的话。只需使用
auto:)
标签: c++ iterator difference size-type