这与如何将reverse_iterator
转换为iterator
并不重复,因为我希望结果与正常转化不同。
仅提供从reverse_iterator
返回的rend
,是否可以将其转换为从iterator
返回的相应end
?
例如
std::vector<int> myvec = {...};
auto rit = myvec.rend();
auto it = MAGIC(rit);
it == myvec.end(); // true
如果仅在reverse_iterator
的情况下无法执行此操作,那么执行此操作所需的最低信息是多少? (所以我可以考虑解决方法)。
答案 0 :(得分:9)
简答:否。
迭代器指的是容器中的一个单独的点,而不是容器本身的实际知识。 end()
和rend()
返回的迭代器指向容器的不同端,即它们引用的点之间可能存在一些,很多或没有元素,而不管其中一个迭代器的反向性质如何。因此,在不知道容器本身或至少它的大小的情况下,不可能从容器的一端到达另一端,并且由于迭代器不具备该知识,因此不可能从{ {1}}至rend()
,end()
至end()
等,无其他信息。
所需的最少信息是&#34; gap&#34;的大小。两点之间。有了它以及反向和非反向迭代器之间的正常转换,这是一项简单的任务:
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
。
答案 1 :(得分:-2)
表达
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
之间关系的示范程序(而不是寺庙论证int
,您可以使用任何类型T
&gt;
#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()