问题标签 [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.

0 投票
1 回答
3042 浏览

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(...)函数相同)。

结论是概念将有助于将理论形式化,但它们并不是魔法,因为某人、某处将在连续的迭代器上定义新的特别命名的函数。该演讲概括为分段迭代器(具有相应的函数segmentlocal),不幸的是它没有提及跨步指针。


编辑 2020:

现在标准有

https://en.cppreference.com/w/cpp/iterator/iterator_tags

0 投票
0 回答
118 浏览

c++ - 为什么 OuputIterator 概念没有关联的 value_type?

我正在编写一个库,我需要在其中创建一个迭代器接口,并且我想让它尽可能通用。

令我惊讶的是大多数输出​​迭代器value_typevoid. (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,但显然有一些相关的类型。这是俯瞰吗?我是否错误地使用了输出迭代器?

0 投票
1 回答
441 浏览

c++ - 为什么 decltype() 会产生一个指向引用的指针?

我正在尝试更好地了解iterator_traits并在 C++ 教科书中找到一段代码。因此,我添加了一些代码以使其可执行,目的是了解该编译时机制的行为。完整的程序如下所示:

编译失败,告诉我们给出了一个指向引用的指针:

并且错误堆栈带来以下行:

这可以在Mac OS和带有g++的Linux机器上编译。

我设法修改了相关部分,如下所示:

您能否更清楚地解释为什么该decltype()函数返回指向引用的指针?我已经阅读了有关 SO 上的类型函数的其他一些问题decltype,也阅读了规范,但既没有让我走上正确的道路,也没有检查输出消息的完整编译器堆栈有任何帮助。

提前感谢您的任何考虑。

0 投票
1 回答
201 浏览

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_­typevalue_­typepointerreferenceiterator_­categoryiterator_­traits<Iterator>则应具有以下作为可公开访问的成员:

否则,iterator_­traits<Iterator>不得有上述任何名称的成员。

任何人都可以解释这是否是一个实现错误,或者为什么我的期望是错误的?

0 投票
1 回答
322 浏览

rust - 接受任何可索引数据类型作为参数的函数

我正在尝试制作一个可以采用任何接受[]运算符的类的函数。我希望它能够接受:

  1. 按引用或按值的数组

  2. 向量或任何其他可以索引的容器

通过一些实验,我发现我还需要一些其他特征,例如PartialOrd, PartialEq。我还需要找出容器中有多少对象。

这是我的代码:

它会产生以下错误:

0 投票
1 回答
411 浏览

c++ - 如何避免为模板化迭代器的每个可能实例化专门化 iterator_traits?

我想改进基于范围的 for 循环,例如通过启用反向迭代。通过编写适配器,我设法让它在某种程度上工作,但我不知道如何使适配器可组合。

第一个循环就像一个魅力,但第二个我得到了错误:

我知道为什么会发生这种情况,并且我知道如何针对这种特殊情况解决它。但是,如果我正确理解这个答案,我将不得不专门iterator_traits针对我的每个可能的实例化,reversed_iterator这实际上并不可行。我有点迷茫,大多数时候我写自己的迭代器我发现自己写了很多样板,只是为了达到我意识到我需要成倍增加的样板才能让它工作的地步。我的意思是我什至没有开始考虑const_iterators。

有没有办法让上述工作(而不必专门iterator_traits针对iterator我想要逆转的每一个?

PS:标记为 C++11,因为那是我当前的范围,但如果对此有改进,我不介意使用更新的标准。

0 投票
3 回答
286 浏览

c++ - 是否有不使用 ptrdiff_t 作为其差异类型的迭代器示例?

我看到它iterator_traits总是定义一个difference_typehttps ://en.cppreference.com/w/cpp/iterator/iterator_traits#Member_types

我只是想知道为什么,这不ptrdiff_t适合每种类型吗?是否有不使用迭代器的示例ptrdiff_t?如果不是,为什么不从各处difference_type消除iterator_traits和使用?ptrdiff_t

0 投票
1 回答
1918 浏览

c++ - 迭代器特征中没有名为 value_type 的类型

我正在尝试编写与标准库兼容的链表集,但遇到了我无法理解的错误。

错误信息是:
错误

这似乎是说它无法在 中找到某些类型iterator_traits,但我不明白我的代码所做的与那里定义的类型有什么关系。

0 投票
3 回答
1055 浏览

c++ - 为什么我不能从 iterator_traits 获取 value_type?

我正在这样做:

我本来希望bar有 type int。但相反,我收到了一个错误:

错误 C2039: value_type: 不是std::iterator_traits<_Ty *const >

这是const我需要剥离它还是什么的问题?

0 投票
1 回答
54 浏览

c++ - 如何理解这个模板在 STL 源代码中的用法?

我目前正在查看SGI STL的源代码,特别是距离算法。

正如我所看到的,为了最大限度地提高效率,SGI 使用了很多内联模板来最大限度地减少运行时间。但我真的不明白一件事。

对于算法距离,SGI定义了一个模板:

然后,它定义了算法距离的公共接口,如

在你对我的知识做出所有判断之前,我想说我认为理解 STL 的设计模式并且我理解每一行的含义,我的意思是语法。

但据我所知,我只是不知道为什么 SGI 没有像这样实现算法距离

据我所知,函数调用会消耗一定的时间,但这里的 iterator_category 是内联函数,与大多数主流编译器中的宏具有相同的效果。

使用 iterator_category() 的唯一不足可能是编译器由于 pass-by-const-reference 而生成的临时对象。

我对吗?或者有什么我还不认识的天才设计模式,有空告诉我!