连续迭代器检测

时间:2017-03-17 07:47:01

标签: c++ iterator c++17 iterator-traits

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丢失?

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

过去我提到 for containers ,如果有.data()成员转换为指向::value类型的指针且.size()成员可兑换指针差异,然后应该假设容器是连续的,但我不能提取迭代器的类似功能。

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

当然,对于所有&(it[n]) == (&(*it)) + n,如果n,则Contiguous概念有效,但在编译时无法检查。

编辑:我发现这个视频将其置于更广泛的C ++概念环境中。 Patrick Niedzielski CppCon 2016: "Building and Extending the Iterator Hierarchy in a Modern, Multicore World"。解决方案使用概念(Lite),但最后的想法是连续的迭代器应该实现pointer_from函数(与我的data(...)函数相同)。

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

1 个答案:

答案 0 :(得分:17)

理由在N4284中给出,这是连续迭代器提议的采用版本:

  

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

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

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

另一方面,有计划通过一些变通方法返回等效的std::contiguous_iterator_tag,以便在C ++ 20中集成Ranges TS。