大家好.一位朋友为我编写了一些Java代码,我很容易将其转换为C,但我对C中的Java迭代器的等价物非常好奇.这是代码,我很可能希望将数据返回到向量中.任何帮助表示赞赏
public class RLEIterator
extends RegionIterator
{
public int reg = 0;
public int mode = 0;
public int skip = 0;
// mode is the number of IDs that are valid still (count down)
// skip is used after we run out of mode IDs,and move forward
// The goal is,to always have a valid 'hasNext' state,after
// an ID is read via 'next'. Thus,the initial search,and then
// the reading forward if mode == 0,after the ID is found.
public int i;
public RLEIterator()
{
// Need to set up the skip of an initial part,so we can
// correctly handle there not being anything,despite there
// being data encoded.
int comp;
i = 0;
while ((mode == 0) && (i
再一次,任何有关如何适应C中单个函数(如果可能)的方案的帮助都会很棒.谢谢!
最佳答案
您对C迭代器有多熟悉?它们的设计看起来非常像指针,因此给定一个迭代器:
++it
将增加迭代器(跳到下一个元素)
*it
将取消引用迭代器(返回它指向的元素的引用)
--it
将(如果它被定义)减少迭代器(返回上一个元素)
通常,C迭代器对它们所操作的容器一无所知.特别是,检查序列中是否还有更多元素的方法不是在迭代器上调用HasNext,而是将它与您知道指向序列末尾的迭代器进行比较. (或者,严格地说,将它与指向序列末尾的元素进行比较.)
除此之外,迭代器需要定义一些typedef和其他辅助内容,以帮助编译器对迭代器的功能进行分类和理解.
定义迭代器的最简单方法是使用Boost.Iterator库的iterator_facade类,它实现了几乎所有的管道.该库具有出色的文档,包括描述如何定义自己的迭代器类型的教程.
如果使用Boost是一个选项,你一定要去做.否则,标准库有std :: iterator也有一点帮助(但是,值得注意的是,不是必需的 – 迭代器可以完全有效地定义而不从这个类派生)
对不起,我没有写完一个完整的例子,但我现在有点急. (而且,如果你能够使用Boost,那么从头开始定义一个示例迭代器就会浪费时间).希望以上内容足以让您入门.