Для поиска первого вхождения элемента в C-Array с элементами POD можно легко сделать это с помощью std::find_if(begin, end, findit)
, Но мне нужен был последний случай. Этот ответ дал мне идею, что это может быть сделано с std::reverse_iterator
, Таким образом я попытался:
std::find_if(std::reverse_iterator<podtype*>(end),
std::reverse_iterator<podtype*>(begin),
findit);
Это дало мне ошибку:
не может конвертировать ‘std :: reverse_iterator< xyz *> ‘в’ xyz * ‘в назначении
У вас есть идея, как это сделать, или вы знаете лучшее решение?
Это код:
#include <iostream>
#include <iterator>
#include <algorithm>
struct xyz {
int a;
int b;
};
bool findit(const xyz& a) {
return (a.a == 2 && a.b == 3);
}
int main() {
xyz begin[] = { {1, 2}, {2, 3}, {2, 3}, {3, 5} };
xyz* end = begin + 4;
// Forward find
xyz* found = std::find_if(begin, end, findit);
if (found != end)
std::cout << "Found at position "<< found - begin
<< std::endl;
// Reverse find
found = std::find_if(std::reverse_iterator<xyz*>(end),
std::reverse_iterator<xyz*>(begin),
findit);
if (found != std::reverse_iterator<xyz*>(end));
std::cout << "Found at position "<< found - std::reverse_iterator<xyz*>(end)
<< std::endl;
return 0;
}
std::find_if
Функция имеет тип возвращаемого значения, равный типу итератора, переданного в качестве параметра. В вашем случае, так как вы проходите в std::reverse_iterator<xyz*>
s в качестве параметров, тип возвращаемого значения будет std::reverse_iterator<xyz*>
, Это означает, что
found = std::find_if(std::reverse_iterator<xyz*>(end),
std::reverse_iterator<xyz*>(begin),
findit);
не скомпилируется, потому что found
является xyz*
,
Чтобы это исправить, вы можете попробовать это:
std::reverse_iterator<xyz*>
rfound = std::find_if(std::reverse_iterator<xyz*>(end),
std::reverse_iterator<xyz*>(begin),
findit);
Это исправит ошибку компилятора. Тем не менее, я думаю, что вы две второстепенные ошибки в этой строке:
if (found != std::reverse_iterator<xyz*>(end));
Во-первых, обратите внимание, что после точки с запятой if
Скажите, поэтому тело if
Оператор будет оцениваться независимо от того, выполняется ли условие.
Во-вторых, обратите внимание, что std::find_if
возвращает второй итератор в качестве часового, если ничто не соответствует предикату. Следовательно, этот тест должен быть
if (rfound != std::reverse_iterator<xyz*>(begin))
так как find_if
вернусь std::reverse_iterator<xyz*>(begin)
если элемент не найден.
Надеюсь это поможет!
Других решений пока нет …