大家好.一位朋友为我编写了一些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<nearRLE.length))
{
// set up the next code
comp = ((int)nearRLE[i]) & 0xff;
if ((comp > 0) && (comp <= 0x3e))
{
// skip forward by comp;
reg += comp;
i++;
mode = 0; // have to keep on reading
}
else if (comp == 0x3f)
{
// skip forward by the following 16 bit word;
// second byte is hi-byte of the word
reg += ((int)nearRLE[i+1]) & 0xff;
reg += (((int)nearRLE[i+2]) & 0xff) << 8;
i+=3;
}
else if (comp == 0xff)
{
// include the following WORD of regions
mode = ((int)nearRLE[i+1]) & 0xff;
mode += (((int)nearRLE[i+2]) & 0xff) << 8;
i += 3;
}
else if ((comp >= 0xc0) && (comp <= 0xfe))
{
// comp - 0xc0 regions are nearby
mode = comp - 0xc0; // +1 perhaps?
i++;
}
else if ((comp >= 0x40) && (comp <= 0x7f))
{
// skip bits 3-5 IDs and then include bits 0-2
reg += (comp & 0x38) >> 3;
mode = (comp & 0x7);
i++;
}
else if ((comp >= 0x80) && (comp <= 0xbf))
{
// include IDs bits 3-5, then skip bits 0-2
mode = (comp & 0x38) >> 3;
skip = (comp & 0x7);
i++;
}
}
}
public boolean hasNext()
{
// not at the end of the RLE, and not currently processing a
// directive. (mode)
return (mode > 0);
}
public int next()
{
int ret = -1;
int comp;
// sanity check first. Shouldn't truthfully get called if mode
// isn't >0
if (mode <= 0)
return -1;
ret = reg;
reg++;
mode--;
if (mode == 0)
{
// skip forward
reg += skip;
skip = 0;
while ((mode == 0) && (i<nearRLE.length))
{
// set up the next code
comp = ((int)nearRLE[i]) & 0xff;
if ((comp > 0) && (comp <= 0x3e))
{
// skip forward by comp;
reg += comp;
i++;
mode = 0; // have to keep on reading
}
else if (comp == 0x3f)
{
// skip forward by the following 16 bit word;
// second byte is hi-byte of the word
reg += ((int)nearRLE[i+1]) & 0xff;
reg += (((int)nearRLE[i+2]) & 0xff) << 8;
i+=3;
}
else if (comp == 0xff)
{
// include the following WORD of regions
mode = ((int)nearRLE[i+1]) & 0xff;
mode += (((int)nearRLE[i+2]) & 0xff) << 8;
i += 3;
}
else if ((comp >= 0xc0) && (comp <= 0xfe))
{
// comp - 0xc0 regions are nearby
mode = comp - 0xc0; // +1 perhaps?
i++;
}
else if ((comp >= 0x40) && (comp <= 0x7f))
{
// skip bits 3-5 IDs and then include bits 0-2
reg += (comp & 0x38) >> 3;
mode = (comp & 0x7);
i++;
}
else if ((comp >= 0x80) && (comp <= 0xbf))
{
// include IDs bits 3-5, then skip bits 0-2
mode = (comp & 0x38) >> 3;
skip = (comp & 0x7);
i++;
}
}
}
return ret;
}
}
Run Code Online (Sandbox Code Playgroud)
同样,任何关于如何在C++中适合单个函数(如果可能)的方案的帮助都会很棒.谢谢!
您对 C++ 迭代器有多熟悉?它们的设计看起来非常像指针,因此给定一个迭代器it:
++it
Run Code Online (Sandbox Code Playgroud)
将增加迭代器(跳到下一个元素)
*it
Run Code Online (Sandbox Code Playgroud)
将取消引用迭代器(返回对其指向的元素的引用)
--it
Run Code Online (Sandbox Code Playgroud)
将(如果已定义)递减迭代器(返回到前一个元素)
一般来说,C++ 迭代器对它们所操作的容器一无所知。特别是,检查序列中是否还有更多元素的方法不是调用HasNext迭代器,而是将其与您知道指向序列末尾的迭代器进行比较。(或者,严格来说,将其与指向序列末尾的元素进行比较。)
除此之外,迭代器需要定义一些 typedef 和其他辅助内容,以帮助编译器分类和理解迭代器的功能。
定义迭代器的最简单方法是使用 Boost.Iterator 库的iterator_facade类,它为您实现了几乎所有的管道。该库拥有出色的文档,包括描述如何定义您自己的迭代器类型的教程。
如果可以选择使用 Boost,那么您绝对应该这样做。否则,标准库std::iterator也有一点帮助(但是,值得注意的是,这不是强制性的——可以完美有效地定义迭代器,而无需从此类派生)
很抱歉我没有写出完整的示例,但我现在有点着急。(而且,如果您能够使用 Boost,那么从头开始定义示例迭代器的麻烦就是浪费时间)。希望以上内容足以帮助您入门。
| 归档时间: |
|
| 查看次数: |
902 次 |
| 最近记录: |