У меня есть код, в котором я не могу переключиться на итераторы. Тем не менее, я хотел бы использовать STL, если возможно, чтобы найти последний элемент (или первый, если вы считаете, что мы выполняем итерацию с конца). Возможно ли это?
std :: find_end помимо того, что алгоритм с наихудшим именем когда-либо кажется довольно уродливым в использовании (мне понадобится поддельная последовательность из 1 элемента и двоичный предикат, который игнорирует значения 1 элемента при сравнении).
То, что у меня есть сейчас, довольно уродливо (тем более, что обратное преобразование bool * не является bool *, поэтому мне приходится делать уродливые вещи, чтобы получить std :: distance.
#include <algorithm>
#include <iostream>
int main()
{
{
bool arr[6] = {true,false,true,true,true,false};
auto e = std::make_reverse_iterator(&arr[0]);
auto b = std::make_reverse_iterator(&arr[6]);
auto it = std::find(b,e, false);
if (it!=e){
std::cout << "index of last false is " << &(*it) - &arr[0] << std::endl;
}
}
// repeat test to make sure result is not an accident
{
bool arr[6] = {true,false,true,true,false,true};
auto e = std::make_reverse_iterator(&arr[0]);
auto b = std::make_reverse_iterator(&arr[6]);
auto it = std::find(b,e, false);
if (it!=e){
std::cout << "index of last false is " << &(*it) - &arr[0] << std::endl;
}
}
}