问题标签 [iterator-traits]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 连续迭代器检测
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
用于连续迭代器的功能。
当然 Contiguous 概念适用&(it[n]) == (&(*it)) + n
于 , for all n
,但这不能在编译时检查。
编辑:我发现这个视频将其置于更广泛的 C++ 概念背景中。CppCon 2016: Patrick Niedzielski撰写的“在现代多核世界中构建和扩展迭代器层次结构” 。该解决方案使用概念(Lite),但最终的想法是连续迭代器应该实现一个pointer_from
函数(与我的data(...)
函数相同)。
结论是概念将有助于将理论形式化,但它们并不是魔法,因为某人、某处将在连续的迭代器上定义新的特别命名的函数。该演讲概括为分段迭代器(具有相应的函数segment
和local
),不幸的是它没有提及跨步指针。
编辑 2020:
现在标准有
c++ - 为什么 OuputIterator 概念没有关联的 value_type?
我正在编写一个库,我需要在其中创建一个迭代器接口,并且我想让它尽可能通用。
令我惊讶的是大多数输出迭代器value_type
是void
. (void
使代码无效,因为void
无法声明变量)。
这里举两个例子:
http://en.cppreference.com/w/cpp/iterator/back_insert_iterator
http://en.cppreference.com/w/cpp/iterator/ostream_iterator
然而,在这两种情况下,都有一个明显的值类型相关联,我可以侵入每一个并“看到”有一个值类型。例如back_insert_iterator::container_type::value_type
(但不能从 访问iterator_traits
)。
为什么标准试图隐藏value_type
输出迭代器?
也许正确的术语不是value_type
,但显然有一些相关的类型。这是俯瞰吗?我是否错误地使用了输出迭代器?
c++ - 为什么 decltype() 会产生一个指向引用的指针?
我正在尝试更好地了解iterator_traits
并在 C++ 教科书中找到一段代码。因此,我添加了一些代码以使其可执行,目的是了解该编译时机制的行为。完整的程序如下所示:
编译失败,告诉我们给出了一个指向引用的指针:
并且错误堆栈带来以下行:
这可以在Mac OS和带有g++的Linux机器上编译。
我设法修改了相关部分,如下所示:
您能否更清楚地解释为什么该decltype()
函数返回指向引用的指针?我已经阅读了有关 SO 上的类型函数的其他一些问题decltype
,也阅读了规范,但既没有让我走上正确的道路,也没有检查输出消息的完整编译器堆栈有任何帮助。
提前感谢您的任何考虑。
c++ - libstdc++ 和 libc++ 之间的 std::iterator_traits 分歧
鉴于:
以下内容适用于 libstc++,但无法针对 libc++ 5.0.0 进行编译:
出现错误:
错误: ' ' 中没有名为 '
iterator_category
' 的std::__1::iterator_traits<Iter>
成员std::is_same<std::iterator_traits<Iter>::iterator_category, Iter::iterator_category>::value, "");
如果Iter::iterator_category
是标准输入类别之一,则静态断言成功,例如std::input_iterator_tag
。
恕我直言,它不应该失败,因为 C++ 草案在[iterator.traits]#2中声明:
如果 Iterator 具有有效的 ( [temp.deduct] ) 成员类型
difference_type
、value_type
、pointer
、reference
和iterator_category
,iterator_traits<Iterator>
则应具有以下作为可公开访问的成员:否则,
iterator_traits<Iterator>
不得有上述任何名称的成员。
任何人都可以解释这是否是一个实现错误,或者为什么我的期望是错误的?
rust - 接受任何可索引数据类型作为参数的函数
我正在尝试制作一个可以采用任何接受[]
运算符的类的函数。我希望它能够接受:
按引用或按值的数组
向量或任何其他可以索引的容器
通过一些实验,我发现我还需要一些其他特征,例如PartialOrd
, PartialEq
。我还需要找出容器中有多少对象。
这是我的代码:
它会产生以下错误:
c++ - 如何避免为模板化迭代器的每个可能实例化专门化 iterator_traits?
我想改进基于范围的 for 循环,例如通过启用反向迭代。通过编写适配器,我设法让它在某种程度上工作,但我不知道如何使适配器可组合。
第一个循环就像一个魅力,但第二个我得到了错误:
我知道为什么会发生这种情况,并且我知道如何针对这种特殊情况解决它。但是,如果我正确理解这个答案,我将不得不专门iterator_traits
针对我的每个可能的实例化,reversed_iterator
这实际上并不可行。我有点迷茫,大多数时候我写自己的迭代器我发现自己写了很多样板,只是为了达到我意识到我需要成倍增加的样板才能让它工作的地步。我的意思是我什至没有开始考虑const_iterator
s。
有没有办法让上述工作(而不必专门iterator_traits
针对iterator
我想要逆转的每一个?
PS:标记为 C++11,因为那是我当前的范围,但如果对此有改进,我不介意使用更新的标准。
c++ - 是否有不使用 ptrdiff_t 作为其差异类型的迭代器示例?
我看到它iterator_traits
总是定义一个difference_type
:https ://en.cppreference.com/w/cpp/iterator/iterator_traits#Member_types
我只是想知道为什么,这不ptrdiff_t
适合每种类型吗?是否有不使用迭代器的示例ptrdiff_t
?如果不是,为什么不从各处difference_type
消除iterator_traits
和使用?ptrdiff_t
c++ - 为什么我不能从 iterator_traits 获取 value_type?
我正在这样做:
我本来希望bar
有 type int
。但相反,我收到了一个错误:
错误 C2039:
value_type
: 不是std::iterator_traits<_Ty *const >
这是const
我需要剥离它还是什么的问题?
c++ - 如何理解这个模板在 STL 源代码中的用法?
我目前正在查看SGI STL的源代码,特别是距离算法。
正如我所看到的,为了最大限度地提高效率,SGI 使用了很多内联模板来最大限度地减少运行时间。但我真的不明白一件事。
对于算法距离,SGI定义了一个模板:
然后,它定义了算法距离的公共接口,如
在你对我的知识做出所有判断之前,我想说我认为理解 STL 的设计模式并且我理解每一行的含义,我的意思是语法。
但据我所知,我只是不知道为什么 SGI 没有像这样实现算法距离
据我所知,函数调用会消耗一定的时间,但这里的 iterator_category 是内联函数,与大多数主流编译器中的宏具有相同的效果。
使用 iterator_category() 的唯一不足可能是编译器由于 pass-by-const-reference 而生成的临时对象。
我对吗?或者有什么我还不认识的天才设计模式,有空告诉我!