c++ - 从迭代器构造的反向迭代器是其先前的迭代器吗?

标签 c++ reverse-iterator

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

std::reverse_iterator is an iterator adaptor that reverses the direction of a given iterator. In other words, when provided with a bidirectional iterator, std::reverse_iterator produces a new iterator that moves from the end to the beginning of the sequence defined by the underlying bidirectional iterator.

For a reverse iterator r constructed from an iterator i, the relationship &*r == &*(i-1) is always true (as long as r is dereferenceable); thus a reverse iterator constructed from a one-past-the-end iterator dereferences to the last element in a sequence.


因此,我尝试使用此代码来了解更多信息:
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;

}
输出:
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()没有对象,因此取消引用过去的结束迭代器是非法的。

关于c++ - 从迭代器构造的反向迭代器是其先前的迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58035084/

相关文章:

c++ - 如何将反向迭代器与作为代理的迭代器一起使用

c++ - 迭代器或 reverse_iterator 的一个变量?

C++ 创建多个套接字客户端

c++ - 使用 vector 来最小化堆分配会导致段错误

c++ - 检查迭代器的类型是否为 reverse_iterator

c++ - 在自定义反向 vector 迭代器中看不到第一个元素

c++ - 计算两个 std::reverse_iterator 之间的 std::distance

c++ - 为什么 Q_OBJECT 会破坏 QDoc?

c++ - 调用 `std::default_random_engine generator` 的正确位置

c++ - C/C++ 以十六进制打印字节,得到奇怪的十六进制值