我试图使用rbegin()
和来自std::find_if()
的迭代器迭代std::vector
。当然iterator
和reverse_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()
之前停下来时,我找不到任何东西。
下面是一个示范程序
#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 );
可以使用std::reverse_iterator
的构造函数访问底层的"normal"迭代器:
for (auto rit = vec.rbegin();
rit != std::vector<int>::reverse_iterator(my_it);
++rit) {
// ...
}
可以将任意一种类型的迭代器转换为另一种类型。正如WhozCraig已经建议的那样,您可以使用rbegin()和rend()来运行您的算法。
如果没有选项,可以使用基迭代器:
auto my_it = std::find_if(vec.begin(), vec.end(), [...]);
for (auto rit = vec.rbegin(); rit.base() - 1 != my_it; ++rit)
{
// do something
}