Aby wyszukać pierwsze wystąpienie elementu w C-Array z elementami POD, można to łatwo zrobić za pomocą std::find_if(begin, end, findit)
. Ale potrzebowałem ostatniego wystąpienia. This answer dał mi pomysł, że można to zrobić z std::reverse_iterator
. Tak więc próbowałem:Jak korzystać z find_if wraz z reverse_iterator na tablicy w stylu C?
std::find_if(std::reverse_iterator<podtype*>(end),
std::reverse_iterator<podtype*>(begin),
findit);
To dało mi błąd:
cannot convert 'std::reverse_iterator< xyz* > ' to 'xyz*' in assignment
masz pomysł, jak to zrobić w ten sposób, czy znasz lepsze rozwiązanie?
Jest to kod:
#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;
}
A compiler error on codepad.org
Tak, to pomaga, dziękuję. Zwrócony indeks wynosi teraz 1 w obu przypadkach, co wydaje się właściwe, ale byłoby wspaniale, gdyby wynik odwrotnego znalezienia dałby indeks 2. Nie mogę odjąć 'begin' od' rfound', ponieważ prowadzi to do tego samego błędu co wcześniej . –
@ ChristianAmmer- Myślę, że to dlatego, że twoja logika, aby uzyskać indeks jest błędna. Odejmowanie oblicza odległość od odwrotnego iteratora do ostatniego elementu tablicy, który podaje odległość * od tyłu * tablicy, a nie od przodu. – templatetypedef
Myślę, że mam to teraz. Logika była zła, ale z '(koniec - początek) - (rfound - std :: reverse_iterator (koniec)) - 1" Otrzymuję poprawny indeks. –