繁体   English   中英

从迭代器构造的反向迭代器是它的前一个迭代器吗?

[英]Is a reverse iterator constructed from an iterator is its previous iterator?

https://en.cppreference.com/w/cpp/iterator/reverse_iterator上说:

std::reverse_iterator是一个迭代器适配器,它反转给定迭代器的方向。 换句话说,当提供双向迭代器时, std::reverse_iterator产生一个新的迭代器,它从底层双向迭代器定义的序列的末尾移动到开头。

对于从迭代器i构造的反向迭代器r ,关系&*r == &*(i-1)始终为真(只要r是可取消引用的); 因此,从一个过去的迭代器构造的反向迭代器取消对序列中最后一个元素的引用。

所以我尝试了这段代码来了解更多:

int main() {


    std::deque<int> di{ 1, 1, 2, 3, 5, 8, 13 }; // fibonacci series
    // deque has bi-directional iterators

    std::deque<int>::iterator offEnd = di.end(); // one-past the last element in di
    std::deque<int>::reverse_iterator r(offEnd); // constructing a reverse iterator from an iterator from deque<int> di

    std::cout << &offEnd << " : " /*<< *r */ << std::endl;
    std::cout << &(offEnd - 1) << " : " << *(offEnd - 1) << std::endl;
    std::cout << &*r << " : " << *r << std::endl;

}

output:

0023FDAC :
0023FC9C : 13
0048C608 : 13

为什么迭代器的值相同但地址不同???!!!

这是否意味着&*r == &*(i-1)不正确?

地址不同,因为你有不同的对象。 (offEnd - 1)r是不同的对象。 因为他们是,他们有不同的地址。 您需要做的是取消引用迭代器,然后获取该地址。 这样做会给你

int main()
{
    std::deque<int> di{ 1, 1, 2, 3, 5, 8, 13 }; // fibonacci series
    // deque has bi-directional iterators

    std::deque<int>::iterator offEnd = di.end(); // one-past the last element in di
    std::deque<int>::reverse_iterator r(offEnd); // constructing a reverse iterator from an iterator from deque<int> di

    std::cout << &(*offEnd) << " : " /*<< *r */ << std::endl;
    std::cout << &(*(offEnd - 1)) << " : " << *(offEnd - 1) << std::endl;
    std::cout << &*r << " : " << *r << std::endl;
}

输出:

0xed3c8c : 
0xed3c88 : 13
0xed3c88 : 13

正如你所看到的,地址是相同的,因为迭代器指向同一个元素。


请注意

&(*offEnd)

是非法的并且是未定义的行为。 end()中没有 object,因此取消引用结束迭代器是非法的。

原因很清楚,当您查询offEndoffEnd-1的地址时也可以看到,它们是相同的。 您正在查询迭代器的地址,如果您使用-运算符在此迭代器中移动,则该地址保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM