最近我看到了一些关于如何使用 boost::zip_iterator 的示例代码。但是,我无法弄清楚它是如何工作的。这是代码:
class to_hex2
{
private:
vector<unsigned char> &v;
char trans(const char c) const
{
if(c >= 'a')
return c - 'a' + 10;
else if(c >= 'A')
return c - 'A' + 10;
else
return c - '0';
}
public:
to_hex2(vector<unsigned char> &_v):
v(_v){}
typedef boost::tuples::tuple<const char&,const char&> Tuple;
void operator()(Tuple const &t) const
{
static char tmp;
tmp = trans(t.get<0>()) * 0x10;
tmp += trans(t.get<1>());
v.push_back(tmp);
}
};
int main()
{
char s[] = "1234aBcD";
vector<unsigned char> v;
typedef step_iterator<const char*> si_t;
for_each(
boost::make_zip_iterator(
boost::tuples::make_tuple(si_t(s),si_t(s+1))),
boost::make_zip_iterator(
boost::tuples::make_tuple(si_t(s+8),si_t(s+9))),
to_hex2(v));
std::copy(
v.begin(),v.end(),std::ostream_iterator<unsigned char>(cout," "));
std::cout<<std::endl<<"v.size="<<v.size();
return 0;
}
step_iterator是一个迭代器,它迭代两个步骤而不是一个步骤。
我的第一个问题是:可以写 s+9 ,因为数组 s 的索引最多为 8(包括 '\0':-) )?虽然代码似乎运行正常。
我的第二个问题是:由于 zip_iterator 可以同时迭代一个向量,这是否意味着结果是随机的?我看到的结果是恒定的,如下图所示:
最后但并非最不重要的一点是,有人可以告诉我结果是如何生成的(它的含义是什么),因为 ASCII 代码中没有上下箭头(我用谷歌搜索并在这里看到了)。