迭代从一端到某处的矢量(不是开始)

时间:2015-08-04 15:00:04

标签: c++ iterator

我正在尝试使用std::vector和来自rbegin()的迭代器迭代std::find_if()。当然iteratorreverse_iterator不兼容。我该怎么办?

auto my_it = std::find_if(vec.begin(), vec.end(), 
    // irrelevant lambda
});

for (auto rit = vec.rbegin(); rit != my_it; ++rit)   // doesn't compile, iterators not compatible
{
    // do something
}

关于如何从rbegin()迭代到rend()有很多问题,但是当我想在rend()之前停止时,我找不到任何内容。

3 个答案:

答案 0 :(得分:2)

您可以使用std::reverse_iterator的{​​{3}}功能访问基础"正常"迭代器:

for (auto rit = vec.rbegin(); 
     rit != std::vector<int>::reverse_iterator(my_it); 
     ++rit) {
    // ...
}

答案 1 :(得分:2)

这是一个示范程序

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    auto it = std::find( v.begin(), v.end(), 5 );

    if ( it != v.end() )
    {        
        std::vector<int>::reverse_iterator last( it );

        for ( auto first = v.rbegin(); first != last; ++first ) std::cout << *first << ' ';
        std::cout << std::endl;
    }       
}    

程序输出

9 8 7 6 5

如果您不想在范围中包含找到的迭代器,那么您可以编写

std::vector<int>::reverse_iterator last( ++it );

答案 2 :(得分:0)

您可以将任何类型的迭代器转换为另一种。正如WhozCraig已经建议的那样,您可以使用rbegin()和rend()来运行算法。

如果这不是一个选项,您可以获得base iterator

auto my_it = std::find_if(vec.begin(), vec.end(), [...]);

for (auto rit = vec.rbegin(); rit.base() - 1 != my_it; ++rit)
{
    // do something
}