最近、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は、1つではなく2つのステップを繰り返すイテレーターです。
私の最初の質問は次のとおりです。配列sのインデックスは最大8('\ 0'を含む:-))なので、s + 9を記述しても大丈夫ですか?ただし、コードは正しく実行されているようです。
私の2番目の質問は、zip_iteratorを使用するとベクトルを同時に反復できるので、結果がランダムであることを意味しますか?次の図では、結果は一定です。
最後になりましたが、ASCIIコードには上下の矢印がないため、結果がどのように生成されるか(その意味は何ですか)を教えてもらえますか(グーグルで検索してここで見ました)。