问题标签 [reverse-iterator]

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 投票
2 回答
154 浏览

c++ - 如何将反向迭代器与作为代理的迭代器一起使用

假设你有一个迭代器,它实际上是一个代理并包含它返回的数据,你怎么能做一个反向迭代器?

解引用运算符的 std::reverse_iterator 实现创建一个临时对象,然后它会递减和取消引用,代码类似于:

结果是它返回给您的是一个指向数据的指针,该指针在您掌握它之前就超出了范围。

这带来了相当不幸的结果。

你怎么能绕过这个?

0 投票
3 回答
174 浏览

c++ - 反转按需迭代器

我有一个DataIterator按需生成值的迭代器,因此取消引用运算符返回一个 Data,而不是 Data&。我认为这是一件可以做的事情,直到我尝试通过将数据 DataIterator 包装在 reverse_iterator 中来反转它。

当我运行上面的代码时,它永远不会找到值等于 0 的 Data 对象,即使我知道存在一个。当我在谓词中插入断点时,我会看到奇怪的值,这些值我从未想过会看到,例如 0xCCCC - 可能是未初始化的内存。发生的情况是 reverse_iterator 的取消引用运算符看起来像这样(来自 xutility - Visual Studio 2010)

最后一行是问题所在 - 创建临时数据并返回对该数据的引用。引用立即无效。

如果我将 std::find_if 中的谓词更改为采用 (Data Candidate) 而不是 (const Data& Candidate) 则该谓词有效 - 但我很确定我只是对那里未定义的行为感到幸运。引用无效,但我在内存被破坏之前制作了数据的副本。

我能做些什么?

  1. 修复我的 DataIterator 以便 operator* 返回 Data& 而不是 Data?我真的不明白这怎么可能。我的 DataIterator 返回 Data 而不是 Data& 的全部意义在于我没有空间将整个未压缩数据集保存在内存中,因此我创建了您想要按需查看的项目。 也许我可以保留“当前”数据值 - 但是当您增加或减少 DataIterator 时,该引用将变得无效。 编辑 其中一个答案建议使用 shared_ptr
  2. 写一个 reverse_iterator 的特化,让它的解引用操作符返回一个值而不是一个引用?这似乎是一项令人沮丧的工作,但可以理解,因为我的 DataIterator 在这里表现不佳 - 而不是 STL 的其余部分。
  3. 沿着同样的思路,也许做一个反向的 find_if - 可能比专门化 reverse_iterator 的工作少。
  4. 其他我没有想到的东西

我可以对 DataIterator 做些什么来防止其他人在 6 个月后尝试同样的事情时花半天时间弄清楚出了什么问题?

0 投票
1 回答
335 浏览

c++ - STL 算法的反向迭代

我有一个函数,它使用 2 个参数指针调用,即数组的开头和结尾。我的函数将从结束指针到开始指针搜索匹配条件的元素。

如果我试图向前迭代,我可以这样做,find_if但我需要反向迭代。STL 对此有任何规定吗?

注意:我可以很容易地在 for 循环中做到这一点。我正在寻找的是一个更优雅的解决方案。

0 投票
3 回答
9419 浏览

c++ - 从反向迭代器获取向量中的索引

我知道如何从向量迭代器中获取索引,方法是从中减去开始迭代器。例如:

但是,现在我想找到x向量中最后一个的索引。如何从反向迭代器中获取真实索引?我发现以下似乎有效(编辑:它没有)但也许有更好的(更惯用的或其他......)方式。

0 投票
3 回答
10551 浏览

c++ - 使用 std::prev(vector.begin()) 或 std::next(vector.begin(), -1) 像 some_container.rend() 作为反向哨兵是否安全?

我写了一些带有迭代器但必须以相反顺序进行比较的代码,

在 VS2013 中,在 Debug 模式下运行时,--last != std::prev(seq_begin)会导致调试器断言失败,并显示错误消息

但是在 Release 模式下运行并给出正确的结果是完全可以的,因为在 Released 模式下没有边界检查。

我的问题是:

  1. std::prev(some_container.begin())像哨兵一样使用安全some_container.rend()吗?

  2. 如何直接比较 areverse_iterator和 a iterator?如果我写代码: std::cout << (std::prev(some_container.begin())==some_container.rend()) << std::endl;它不会编译,即使你是reinterpret_cast他们。

我很好奇身体上是否prev(some_container.begin())相等?some_container.rend()

0 投票
1 回答
63 浏览

c++11 - 奇怪的 std::vector::reverse_iterator 和字符串行为

所以我有一个线性向量,我用来通过一个类存储 2D 值:现在我想反向打印值......即值(0,0)占据左下角并(max_x,max_y)占据右上角......就像典型的笛卡尔网格一样。这是我的代码:

注意:如果我不直接使用字符串和打印,一切都很好,只是顺序颠倒了。我所有的成员函数都工作 现在在我的主代码中,我用std::fill我需要的值填充向量(类函数调用)。然后更改一些值,例如 at(0,0)(max_x,max_y)手动。(成员函数)所以说我为 6x6 =36 大小的向量填充了 2.38,然后更改了。现在我将要访问的第一个值(向量中的最后一个,反向迭代器中的第一个)更改为 3. 并运行程序。输出:

那是向量的整个大小,我只得到初始的 std::fill 值......有什么问题?我想避免[]运营商。

0 投票
2 回答
835 浏览

c++ - 在自定义迭代器上应用 reverse_iterator 后引用失效

我实现了一个双向迭代器,但是它不是在数据结构上操作,而是返回一个数学序列,可以在两个方向上迭代计算。事实上,我正在遍历整数,在 int 上使用 ++ 和 -- 。这意味着数据不会存储在不同的结构中,因此当迭代器超出范围时,值也会如此。

尽管如此,我希望下一个代码(最小的失败示例)示例能够工作,因为迭代器始终保持在范围内。但它不起作用:(

来源:http: //ideone.com/YJKvpl

if-branch 导致内存冲突,正如 valgrind 正确检测到的那样:

else-branch 不会导致内存冲突,或者至少在我的 valgrind 可以检测到的范围内。但是,存储在向量中的值是“随机的”:

我对发生的事情感到有些惊讶。迭代器应该一直在范围内,但引用似乎变得无效。为什么在打印 12 时会出现内存违规,或者为什么在存储与 12 不同的内容时我没有得到它们?

0 投票
2 回答
528 浏览

c++ - 自定义双向迭代器的 reverse_iterator 上的 for_each 需要 OutputIterator

我创建了一个简单的不可变双向迭代器:

迭代器是不可变的,因为 operator*() 返回一个int而不是int 引用。据我所知,这是可能的,因为迭代器是否满足 BidirectionalIterator 概念或 OutputIterator 概念是正交的(所有 4 种组合都是可能的)。

但是,下面的代码会导致编译时错误,即:

完整的上下文:

cppreference 上关于 reverse_iterator 和 for_each 状态的页面分别需要 BidirectionalIterator 和 InputIterator。我认为这两个要求都得到了满足,但是 stl 仍然为引用分配了一个取消引用的值。

为什么 stl 的 for_each/reverse_iterator 期望在不需要成为 OutputIterator 的迭代器上使用 T &operator*()?

PS:注释行可以通过说明引用应该按值存储来解决问题,当然非常hacky。

0 投票
2 回答
587 浏览

c++ - 为什么 reverse_iterator 双重定义它的嵌套类型?

似乎迭代器适配器reverse_iterator双重定义了它的大多数嵌套类型。特别是,它公开继承std::iterator暴露的iterator_categoryvalue_typedifference_type和。除了and ,这些都在类定义中再次显式定义。pointerreferenceiterator_categoryvalue_typetypedef

24.5.1.1 类模板 reverse_iterator [reverse.iterator]

问题:为什么重复定义?这仅仅是为了说明,还是有更多的意义?为什么不重新定义iterator_categoryand value_type

0 投票
1 回答
571 浏览

c++ - 从 reverse_iterator 中的用户定义的迭代器继承所有函数

我正在为 C++11 编写 JSON 类,请参阅http://github.com/nlohmann/json。我的中心数据结构是一个类,将 JSON 值类型(null、array、object、string、bool、number)包装在一个联合中,并通过一个不错的 C++ 接口提供它。由于数组(通过 实现std::vector)和对象(std::map)带有它们自己的迭代器,因此我实现了一个“包装器”迭代器,它将调用委托给operator++或委托operator->给各自的成员变量。此外,我实现了两个附加函数std::string key()来访问 JSON 对象的键并reference value()作为operator*().

到目前为止,一切都很好(有关完整的源代码,请参见https://github.com/nlohmann/json/blob/master/src/json.hpp )...

然后我想实现reverse_iteratorand const_reverse_iterator。问题就从这里开始了。

  • 如果我通过using reverse_iterator = std::reverse_iterator<iterator>;and实现它们using const_reverse_iterator = std::reverse_iterator<const_iterator>;,一切都很好,但是函数key()andvalue()不适用于reverse_iteratororconst_reverse_iterator对象。
  • 如果我实现我自己的类reverse_iteratorclass reverse_iterator : public std::reverse_iterator<typename basic_json::iterator>我需要再次实现整个类。key()仅提供and的实现是不够的value(),还operator++()包括我希望使用std::reverse_iterator适配器免费获得的所有其他东西。

我花了很多时间寻找答案,但我发现的所有参考资料要么只是触及不完整的玩具示例的表面,要么得出的结论是迭代器是一项艰苦的工作,应该转向 Boost ......

所以这是我的问题:

  1. 如何reverse_iterator从我的自定义类创建一个,iterator以便它继承尽可能多的功能?
  2. 如果继承标准东西之外的行为不能自动工作,我怎么能在reverse_iterator不完全重复自己的情况下编写一个?

任何帮助是极大的赞赏!