连续迭代器检测

alf*_*lfC 27 c++ iterator iterator-traits c++17

C++ 17引入了ContiguousIterator的概念http://en.cppreference.com/w/cpp/iterator.然而,似乎没有计划contiguous_iterator_tag(通过我们现在以同样的方式random_access_iterator_tag)报告std::iterator_traits<It>::iterator_category.

为什么contiguous_iterator_tag失踪?

是否有传统的协议来确定迭代器是否是连续的?还是编译时间测试?

在过去我提到过,对于容器,如果有一个.data()成员转换为指向::value类型的指针,并且有.size()成员可转换为指针差异,那么应该假设容器是连续的,但我不能提取迭代器的类似特征.

一种解决方案可能是data为连续迭代器提供一个函数.

当然,连续概念&(it[n]) == (&(*it)) + n在所有情况下都有效n,但在编译时无法检查.


编辑:我发现这个视频把它放在更广泛的C++概念上下文中.CppCon 2016:"在现代多核世界中构建和扩展迭代器层次结构",作者:Patrick Niedzielski.解决方案使用概念(Lite),但最后的想法是连续的迭代器应该实现一个pointer_from函数(与我的data(...)函数相同).

结论是概念将有助于形式化理论,但它们并不神奇,在某种意义上,某个人会在某个地方定义新的特别命名的函数而不是连续的迭代器.这个讨论概括了分段迭代器(带有相应的函数segmentlocal),不幸的是它没有说明跨步指针.

Mor*_*enn 19

N4284给出了基本原理,它是连续迭代器提议的采用版本:

本文介绍了术语"连续迭代器"作为随机访问迭代器的一种改进,没有引入相应的contiguous_iterator_tag,在Nea Liber的论文N3884"连续迭代器:随机访问迭代器的改进"的Issaquah讨论中被发现破坏了代码.

有些代码被破坏了,因为它假设std::random_access_iterator无法改进,并对其进行了明确的检查.基本上它破坏了不依赖于多态来检查迭代器类别的坏代码,但它仍然破坏了代码,因此contiguous_iterator_tag从提案中删除了.

此外,std::reverse_iterator类似的类还有一个问题:反向连续迭代器不能是连续的迭代器,而是常规的随机访问迭代器.这个问题本来可以解决std::reverse_iterator,但是更多用户定义的迭代器包装器在复制迭代器类别时会增加迭代器,这样会使lied或者停止正常工作(例如Boost迭代器适配器).


另外,有计划std::contiguous_iterator_tag通过一些变通方法来恢复相当的工作量,以便在C++ 20中集成Ranges TS.

  • @alfC 谢谢,我用 C++20 提供的连续迭代器的(希望是准确的)摘要更新了答案。 (2认同)