C ++中反向迭代器的异常行为

时间:2018-10-11 13:26:25

标签: c++ vector iterator find

这是我今天在计算机上进行的一项测试,我被要求实施具有两个功能的Gardner类-每个都将标记割下的Gardner站立的一块土地,并将Gardner移动3个单位到左还是右。如果Gardner的道路上有任何标有割据的土地,他将跳过该土地并继续前进到下一个土地。

我使用布尔变量向量对土地建模。我正在将std :: find()与正向迭代器一起使用,以查找未在正确方向修剪的陆地,而我正在向左方向使用反向迭代器。前向迭代器按预期工作。但是,反向迭代器产生了一些奇怪的结果。更具体地说,例如,在Visual Studio的调试器中,它显示反向迭代器指向的值为false(这是预期的),但是当我取消引用反向迭代器时,则为true。可以在下面的代码中复制该代码,我已附加了代码,感谢您的帮助。

var router = express.Router();
router.get('/tif/:test2/:one', (req, res) => {
  res.send("Test two");
});

router.get('/tif/test1/:one', (req, res) => {
  res.send("Test one");
});

module.exports = router;

1 个答案:

答案 0 :(得分:0)

要了解反向迭代器的状况, 看一下reverse_iterator at cppreference。更具体地说,请看base() method

  

基本迭代器引用 next (从   PART_Button透视)到元素   std::reverse_iterator::iterator_type当前指向。那就是reverse_iterator

英语:

&*(rit.base() - 1) == &*rit(反向迭代器的)将访问mLands的元素,该元素比*rit.base()尚未访问的元素多。 *rit*rit之间的这种转换使得可以使*rit.base()逻辑上指向mLands.rend()的第一个元素之后。它与mLands的镜像等效,指向mLands.end()的最后一个元素。

现在,了解在调试器中看到的内容。调试器很可能向您显示mLands的值,该值指向rit.base()中的元素早于mLands的逻辑指向。这可以解释您在此处看到的差异。对于调试,如果不确定调试器将显示什么,这里最安全的方法是打印rit的值或将其存储在临时变量中,然后在调试器中进行检查。