从vector :: iterator获取vector :: reverse_iterator?

时间:2015-01-19 18:09:48

标签: c++ vector iterator

我有问题迭代和std::vector。我在while循环中使用std::vector::iterator进行迭代,并且在某个时刻进入我的循环,我希望std::vector::reverse_iterator指向与iterator相同的元素。但我无法弄清楚如何做到正确。

这是一个帮助您了解我的问题的片段。在这里,例如,我有tab向量包含(1,2,3,4,5,6,7),我想打印出类似的东西:

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;

我希望我的问题很明确,谢谢你的帮助。 :)

3 个答案:

答案 0 :(得分:2)

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

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

foo.begin指向第一个元素,其中rit将指向第一个元素之前的一个元素。有了这个你可以成为循环

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

答案 1 :(得分:1)

给定一对像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;

答案 2 :(得分:1)

std::vector<int>::reverse_iterator j{i+1};

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

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