看MSDN关于rbegin和rend的描述时,会理解rbegin()返回的是指向容器的最后一个元素的iterator,而rend()返回的是指向容器第一个元素“左侧”的一个无效元素。
例如:
std::vector<int> test;
test.push_back(1);
test.push_back(2);
std::vector<int>::reverse_iterator rit_b = test.rbegin(); // rit_b指向元素2
std::vector<int>::reverse_iterator rit_e = test.rend(); //rit_e指向元素1左侧的无效元素
虽然这样理解在实际使用时并不会出错。但是当你用调试器设置断点去观察rit_b和rit_e的值的时候,你会发现实际上:
rit_b就是end()返回的指向最后一个元素右侧的无效元素的iterator。
rit_e就是begin()返回的指向第一个元素的iterator。
当你在使用rit的时候,例如:
int x = *rit;
STL的实现是:
_Reference operator*() const
{ // return designated value
_BidIt _Tmp = current;
return (*--_Tmp);
}
上面的代码片段里,current就是那个正向iterator。然后把current赋值给一个临时iterator,然后把这个临时iterator减1,再取值返回!
如果按照MSDN文档里的描述简单的理解,在调试程序的时候这个地方很容易产生困惑,进而造成程序逻辑推理上的错误。