Как вы используете find_if вместе с reverse_iterator для массива в стиле C?

Для поиска первого вхождения элемента в 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;
}

И ошибка компилятора на codepad.org

9

Решение

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) если элемент не найден.

Надеюсь это поможет!

11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]