这不是如何将 reverse_iterator
转换为 iterator
的重复,因为我希望结果与正常转换不同。
只给定一个从 rend
返回的 reverse_iterator
,是否可以将其转换为相应的 iterator
从 结束
?
例如
std::vector<int> myvec = {...};
auto rit = myvec.rend();
auto it = MAGIC(rit);
it == myvec.end(); // true
如果仅给定 reverse_iterator
不可能做到这一点,那么做到这一点所需的最少信息是什么? (所以我可以考虑变通办法)。
最佳答案
简答:否。
迭代器指的是容器中的一个点,而不需要容器本身的实际知识。 end()
和 rend()
返回的迭代器指向容器的不同端点,即它们指向的点之间可能有一些、很多或没有元素,不管其中一个迭代器的反向性质如何。因此,在不知道容器本身或至少不知道其大小的情况下,不可能从容器的一端到达另一端,并且由于迭代器不知道该知识,因此不可能从 rend()
到 end()
,从 end()
到 begin()
等,无需额外信息。
最少需要的信息是两点之间“差距”的大小。有了它以及反向和非反向迭代器之间的正常转换,这是一个简单的任务:
auto rend = v.rend();
auto begin = rend.base();
assert(begin == v.begin());
auto end = begin + v.size(); //the size is the key!
assert(end == v.end());
但是,由于您无法从 reverse_iterator
中获取大小,而只能从容器本身获取大小,因此您可以轻松地首先向它请求 end()
。
关于c++ - 将 rend 迭代器转换为 end 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757121/