Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较向量<;T>;::带向量的迭代器<;T>;::反向迭代器_C++_Vector_Stl_Iterator - Fatal编程技术网

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);