问题标签 [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.
c++ - 如何将反向迭代器与作为代理的迭代器一起使用
假设你有一个迭代器,它实际上是一个代理并包含它返回的数据,你怎么能做一个反向迭代器?
解引用运算符的 std::reverse_iterator 实现创建一个临时对象,然后它会递减和取消引用,代码类似于:
结果是它返回给您的是一个指向数据的指针,该指针在您掌握它之前就超出了范围。
这带来了相当不幸的结果。
你怎么能绕过这个?
c++ - 反转按需迭代器
我有一个DataIterator
按需生成值的迭代器,因此取消引用运算符返回一个 Data,而不是 Data&。我认为这是一件可以做的事情,直到我尝试通过将数据 DataIterator 包装在 reverse_iterator 中来反转它。
当我运行上面的代码时,它永远不会找到值等于 0 的 Data 对象,即使我知道存在一个。当我在谓词中插入断点时,我会看到奇怪的值,这些值我从未想过会看到,例如 0xCCCC - 可能是未初始化的内存。发生的情况是 reverse_iterator 的取消引用运算符看起来像这样(来自 xutility - Visual Studio 2010)
最后一行是问题所在 - 创建临时数据并返回对该数据的引用。引用立即无效。
如果我将 std::find_if 中的谓词更改为采用 (Data Candidate) 而不是 (const Data& Candidate) 则该谓词有效 - 但我很确定我只是对那里未定义的行为感到幸运。引用无效,但我在内存被破坏之前制作了数据的副本。
我能做些什么?
- 修复我的 DataIterator 以便 operator* 返回 Data& 而不是 Data?我真的不明白这怎么可能。我的 DataIterator 返回 Data 而不是 Data& 的全部意义在于我没有空间将整个未压缩数据集保存在内存中,因此我创建了您想要按需查看的项目。
也许我可以保留“当前”数据值 - 但是当您增加或减少 DataIterator 时,该引用将变得无效。编辑 其中一个答案建议使用 shared_ptr - 写一个 reverse_iterator 的特化,让它的解引用操作符返回一个值而不是一个引用?这似乎是一项令人沮丧的工作,但可以理解,因为我的 DataIterator 在这里表现不佳 - 而不是 STL 的其余部分。
- 沿着同样的思路,也许做一个反向的 find_if - 可能比专门化 reverse_iterator 的工作少。
- 其他我没有想到的东西
我可以对 DataIterator 做些什么来防止其他人在 6 个月后尝试同样的事情时花半天时间弄清楚出了什么问题?
c++ - STL 算法的反向迭代
我有一个函数,它使用 2 个参数指针调用,即数组的开头和结尾。我的函数将从结束指针到开始指针搜索匹配条件的元素。
如果我试图向前迭代,我可以这样做,find_if
但我需要反向迭代。STL 对此有任何规定吗?
注意:我可以很容易地在 for 循环中做到这一点。我正在寻找的是一个更优雅的解决方案。
c++ - 从反向迭代器获取向量中的索引
我知道如何从向量迭代器中获取索引,方法是从中减去开始迭代器。例如:
但是,现在我想找到x
向量中最后一个的索引。如何从反向迭代器中获取真实索引?我发现以下似乎有效(编辑:它没有)但也许有更好的(更惯用的或其他......)方式。
c++ - 使用 std::prev(vector.begin()) 或 std::next(vector.begin(), -1) 像 some_container.rend() 作为反向哨兵是否安全?
我写了一些带有迭代器但必须以相反顺序进行比较的代码,
在 VS2013 中,在 Debug 模式下运行时,--last != std::prev(seq_begin)
会导致调试器断言失败,并显示错误消息
但是在 Release 模式下运行并给出正确的结果是完全可以的,因为在 Released 模式下没有边界检查。
我的问题是:
std::prev(some_container.begin())
像哨兵一样使用安全some_container.rend()
吗?如何直接比较 a
reverse_iterator
和 aiterator
?如果我写代码:std::cout << (std::prev(some_container.begin())==some_container.rend()) << std::endl;
它不会编译,即使你是reinterpret_cast
他们。
我很好奇身体上是否prev(some_container.begin())
相等?some_container.rend()
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 值......有什么问题?我想避免[]
运营商。
c++ - 在自定义迭代器上应用 reverse_iterator 后引用失效
我实现了一个双向迭代器,但是它不是在数据结构上操作,而是返回一个数学序列,可以在两个方向上迭代计算。事实上,我正在遍历整数,在 int 上使用 ++ 和 -- 。这意味着数据不会存储在不同的结构中,因此当迭代器超出范围时,值也会如此。
尽管如此,我希望下一个代码(最小的失败示例)示例能够工作,因为迭代器始终保持在范围内。但它不起作用:(
来源:http: //ideone.com/YJKvpl
if-branch 导致内存冲突,正如 valgrind 正确检测到的那样:
else-branch 不会导致内存冲突,或者至少在我的 valgrind 可以检测到的范围内。但是,存储在向量中的值是“随机的”:
我对发生的事情感到有些惊讶。迭代器应该一直在范围内,但引用似乎变得无效。为什么在打印 12 时会出现内存违规,或者为什么在存储与 12 不同的内容时我没有得到它们?
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。
c++ - 为什么 reverse_iterator 双重定义它的嵌套类型?
似乎迭代器适配器reverse_iterator
双重定义了它的大多数嵌套类型。特别是,它公开继承std::iterator
暴露的iterator_category
、value_type
、difference_type
和。除了and ,这些都在类定义中再次显式定义。pointer
reference
iterator_category
value_type
typedef
24.5.1.1 类模板 reverse_iterator [reverse.iterator]
问题:为什么重复定义?这仅仅是为了说明,还是有更多的意义?为什么不重新定义iterator_category
and value_type
?
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_iterator
and const_reverse_iterator
。问题就从这里开始了。
- 如果我通过
using reverse_iterator = std::reverse_iterator<iterator>;
and实现它们using const_reverse_iterator = std::reverse_iterator<const_iterator>;
,一切都很好,但是函数key()
andvalue()
不适用于reverse_iterator
orconst_reverse_iterator
对象。 - 如果我实现我自己的类
reverse_iterator
,class reverse_iterator : public std::reverse_iterator<typename basic_json::iterator>
我需要再次实现整个类。key()
仅提供and的实现是不够的value()
,还operator++()
包括我希望使用std::reverse_iterator
适配器免费获得的所有其他东西。
我花了很多时间寻找答案,但我发现的所有参考资料要么只是触及不完整的玩具示例的表面,要么得出的结论是迭代器是一项艰苦的工作,应该转向 Boost ......
所以这是我的问题:
- 如何
reverse_iterator
从我的自定义类创建一个,iterator
以便它继承尽可能多的功能? - 如果继承标准东西之外的行为不能自动工作,我怎么能在
reverse_iterator
不完全重复自己的情况下编写一个?
任何帮助是极大的赞赏!