最近我看到了一些關於如何使用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