最近我看到了一些关于如何使用boost :: zip_iterator的示例代码。但是,我无法弄清楚它是如何工作的。下面是代码:关于使用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的索引高达8(包括'\ 0':-)),编写s + 9是否可行?该代码似乎运行正常,虽然。
我的第二个问题是:由于zip_iterator可以同时迭代一个向量,这是否意味着结果是随机的?我看到的结果是恒定的,如下图:
最后但并非最不重要的,可能有人请告诉我是怎么产生的结果(什么是它的意思),因为在ASCII没有上下箭头代码(我GOOGLE了它,看到它here)。
一个数组有N-1个元素,所以如果你解引用第N个元素,你会得到**未定义的行为**。 ''boost :: tuples :: make_tuple(si_t(s + 8),si_t(s + 9)))'这是未定义的行为,你的数组只有8个长,这意味着元素8不可访问,元素9是lala land并且不在您的范围之内。 – 2013-02-25 08:19:09
要纠正@TonyTheLion所说的话:指向数组中的任何位置并指引指针是合法的;指向一个超过数组的末尾是合法的,但解引用这样的指针是未定义的行为;指向任何其他地方都是未定义的行为,即使指针从未解除引用。所以'char * p = s + 9'可以,只要你不解除引用'p',但'p = s + 10'就是未定义的行为。因此,这是代码是有效的指针。 – 2013-02-25 08:51:16
@LucTouraille此处的数组大小为8,因此N-1是最后一个实际元素。是不是8,然后是数组的末尾? – 2013-02-25 09:13:26