将rend迭代器转换为结束迭代器
这不是如何将reverse_iterator
转换为iterator
的副本,因为我希望结果与正常转换不同。将rend迭代器转换为结束迭代器
鉴于仅是从rend
返回reverse_iterator
,是否有可能将其转换为将来自end
返回相应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()
在第一位。
表达
myvec.rend().base()
相当于
myvec.begin()
下面是一个示范性例子
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::vector<int>::iterator it = v.rend().base();
std::cout << *it << std::endl;
return 0;
}
输出
1
另一示范程序,显示std::vector<int>::iterator
和std::vector<int>::reverse_iterator
(代替templetae参数int
你可以使用任何类型T
>
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
if (v.begin() == v.rend().base())
{
std::cout << "v.begin() == v.rend().base()" << std::endl;
}
if (v.end() == v.rbegin().base())
{
std::cout << "v.end() == v.rbegin().base()" << std::endl;
}
return 0;
}
之间的关系
输出是
v.begin() == v.rend().base()
v.end() == v.rbegin().base()
这不是问题的答案。问题是关于'rend()'和'end()'之间的关系,而不是'rend()'和'begin()'之间的关系。 – 2014-11-05 12:36:34
我认为除了'rend'迭代器之外,做这件事的最小信息是从开始到结束的距离。即容器的大小。 – user2079303 2014-11-05 12:43:36
'rend()'和'end()'之间没有关系。重建'end()'所需的最少信息是'end()'。 – 2014-11-05 12:47:41
@ n.m。或'size()' – 2014-11-05 12:49:32