C++ 比较向量<;T>;::带向量的迭代器<;T>;::反向迭代器
我正在做一个练习,我有一个向量,我正在写我自己的反向算法,使用反向和正常(正向)迭代器来反向向量的内容。但是,我无法比较迭代器C++ 比较向量<;T>;::带向量的迭代器<;T>;::反向迭代器,c++,vector,stl,iterator,C++,Vector,Stl,Iterator,我正在做一个练习,我有一个向量,我正在写我自己的反向算法,使用反向和正常(正向)迭代器来反向向量的内容。但是,我无法比较迭代器 int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; vector<int> numbers(vals, vals + 10); vector<int>::iterator start = numbers.begin(); vector<int>::reverse_iterator
int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
vector<int> numbers(vals, vals + 10);
vector<int>::iterator start = numbers.begin();
vector<int>::reverse_iterator end = numbers.rend();
intvals[]={1,2,3,4,5,6,7,8,9,0};
向量数(VAL,VAL+10);
向量::迭代器开始=数字。开始();
vector::reverse_迭代器end=numbers.rend();
我以前有一个使用两个迭代器反转向量的算法,但是在这个任务中,我无法使用!=接线员在他们之间。我的猜测是在向量中相互获取基础指针或索引,但如何获取指针/索引?您可以通过调用将
反向迭代器
转换为迭代器
但是要小心,因为有一些警告@Matthieu M.的评论特别有用:
注意:base()
反向迭代器
指向的元素
结帐
返回一个“正常”迭代器。使用由返回的迭代器进行比较:it==rit.base()-1
您可以使用(&*start==&*(end-1))
直接比较迭代器指向的地址 这两种类型无法比较(这是一个非常好的主意),在我看来调用.base()
不是很优雅(或通用)。
您可以转换类型并比较结果。
考虑到涉及反向迭代器的off by one规则
从迭代器
到反向迭代器
的转换需要明确(幸运的是),但是,从反向迭代器到迭代器的转换是不可能的(不幸的是)。
因此,只有一种方法可以进行转换,然后进行比较
std::vector<double> vv = {1.,2.,3.};
auto it = vv.begin();
auto rit = vv.rend();
// assert( it == rit ); // error: does not compile
assert(std::vector<double>::reverse_iterator{it} == rit);
std::vector vv={1,2,3};
自动it=vv.begin();
自动rit=vv.rend();
//断言(it==rit);//错误:未编译
断言(std::vector::reverse_迭代器{it}==rit);
注意:base()
实际上会将一个迭代器
返回到反向迭代器
指向的元素后面的元素。@Matthieu M:是的,这是我要写的主要警告-但是既然你已经这样做了,我想我不必再这样做了。谢谢@托比斯佩特:你说得对,所以我现在就是这么做的。不过要小心。如果rit
是一个结束迭代器(即反向迭代的结束),那么rit.base()
是numbers.begin()
,从中减去1就是UB。另一种方法是比较距离(numbers.begin(),it)=距离(rit,numbers.rend())-1
@SteveJessop:当然,还有一个问题是,-1
通常不能应用于双向迭代器,而只能应用于随机访问迭代器,因此@wilx提供的代码不适用于list
。建议通过it==std::prev(rit.base())
@exa删除随机访问需求:这是对涉及向量迭代器的特定问题的回答。一般来说,按你的方式做可能是个好主意,但在这种情况下,这是不必要的。我相信大多数人都能自己进行泛化。在你的练习中,使用两个正向迭代器会更容易:For(vector::iterator I=numbers.begin(),j=numbers.end();I
你可以。。。但是你应该吗?:)这并不能回答问题。OP询问如何将迭代器与反向迭代器进行比较,而不是如何比较start和end-1元素的地址。
std::vector<double> vv = {1.,2.,3.};
auto it = vv.begin();
auto rit = vv.rend();
// assert( it == rit ); // error: does not compile
assert(std::vector<double>::reverse_iterator{it} == rit);