从 vector::iterator 得到 vector::reverse_iterator?

Getting a vector::reverse_iterator from a vector::iterator?

我在遍历 std::vector 时遇到问题。我在 while 循环中使用 std::vector::iterator 进行迭代,在我的循环中的某个时刻,我想要一个 std::vector::reverse_iterator 指向与 iterator 相同的元素。但我不知道如何正确处理。

这里有一个片段可以帮助您理解我的问题。在这里,例如,我有包含 (1,2,3,4,5,6,7) 的 tab 向量,我想打印出如下内容:

1
21
321
4321
54321
654321
7654321

这是我首先想到的代码:

std::vector<int> tab {1, 2, 3, 4, 5, 6, 7}; // C++11 needed here, if I recall correctly

for(std::vector<int>::iterator i(tab.begin()) ; i != tab.end() ; ++i) {
    for(std::vector<int>::reverse_iterator j(/* ? */) ; j != tab.rend() ; ++j) {
        std::cout << *j;
    }
std::cout << std::endl;

我希望我的问题很清楚,谢谢你的帮助。 :)

给定一对任意迭代器,如 tab.begin()i,您可以使用 std::reverse_iterator 反转它们,大致如下:

for(std::vector<int>::iterator i(tab.begin()) ; i != tab.end() ; ++i) {
    typedef std::reverse_iterator<std::vector<int>::iterator> riterator;
    riterator start = riterator(i); //start toward the back-ish
    riterator stop = riterator(tab.begin()) //stop at the front
    for(riterator j=start; j!=stop; ++j) 
        std::cout << *j;

您可以从迭代器构造反向迭代器。要记住的重要一点是,当你这样做时,它会返回一个元素。如果你这样做:

std::vector<int>::reverse_iterator rit(foo.begin());

foo.begin 指向第一个元素,其中 rit 将指向第一个元素之前的元素。这样你的for循环就可以变成

std::vector<int> tab {1, 2, 3, 4, 5, 6, 7}; // C++11 needed here, if I recall correctly

for(std::vector<int>::iterator i(tab.begin()) ; i != tab.end() ; ++i) {
    for(std::vector<int>::reverse iterator j(i + 1) ; j != tab.rend() ; ++j) {
        std::cout << *j;
    }
    std::cout << std::endl;
}
std::vector<int>::reverse_iterator j{i+1};

的反向迭代器总是有一个 "base",一个基本迭代器的实例。我不确定原因,但他们希望这个基础实例具有相同的端点,即 v.begin()==v.rend(), v.end()==v.rbegin()。这意味着为了得到一个指向同一个端点的迭代器,你有一个偏移量:

v.begin()+10==
v.rend()-10-1==
reverse_iterator(v.begin()+10+1)==
reverse_iterator(v.begin()+10)-1