Очень часто два (обратных) итератора охватывают диапазон значений (например, в begin(),end()
и rbegin(),rend()
).Для любого диапазона, описанного двумя обратными итераторами rA,rB
, диапазон rB.base(),rA.base()
будет охватывать тот же диапазон в прямом направлении.
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> vec{10,11,12,13,14,15};
// spans the range from 13 to 10
auto rfirst=std::rbegin(vec)+2;
auto rlast=std::rend(vec);
// Loops forward, prints 10 11 12 13
for(auto it = rlast.base(); it != rfirst.base(); ++it){
std::cout << *it << " ";
}
}
Если концептуально вас интересует только один элемент (напримеррезультат find_if
), затем используйте make_forward
@visitor.Даже в этом случае идея диапазона помогает отслеживать действительность обратного итератора:
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec{10,11,12,13,14,15};
auto rfirst=std::rbegin(vec);
auto rlast=std::rend(vec);
auto rfound = std::find_if(rfirst,rlast, [](int v){ return v<13; });
if(rfound != rlast){
std::cout << *rfound << " "; // prints 12
auto forwardFound = make_forward(rfound) ;
std::cout << *forwardFound << " "; // prints 12
}
}