Щоб знайти останній елемент з якоюсь властивістю було б зручно користуватися цією ж функцією find_if, але переглядати вектор з кінця до початку. При зворотному перегляді перший знайдений елемент буде останнім при прямому перегляді.
Для зворотного перегляду вектора використовується зворотний ітератор.
Для цього ітератора початок і кінець вектора немов би міняються місцями
| vector <int>::reverse_iterator itt; |
|---|
Встановити ітератор на останній елемент вектора v
| itt =v.rbegin(); |
|---|
Встановити ітератор перед першим елементом вектора v
| itt =v.rend(); |
|---|
Коли ви використовуєте зворотний ітератор, наприклад itt, то для отримання відповідного прямого ітератора it (який вказує на той самий елемент, але у звичайному напрямку), можна скористатися методом base().
Метод base() для зворотного ітератора повертає прямий ітератор, який вказує на наступний елемент після поточного.
Це важливо враховувати: прямий ітератор, що повертає метод base(), не вказує на той самий елемент, що і зворотний, він вказує на наступний після нього.
Тому, для отримання прямого ітератора, який вказує на елемент, що знаходиться в позиції поточного зворотного ітератора, потрібно
| it=itt.base()-1; |
|---|
Написати таку програму:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
// Прототипи функцій
void RandVect(vector<int>& v, int n, int a, int b);
void PrintVect(const vector<int>& v);
bool Neg(int x);
int main() {
// Ініціалізація генератора випадкових чисел
srand(time(0));
vector<int> vect;
int a, b, n;
// Введення параметрів
cout << "Введіть мінімальне значення (a): ";
cin >> a;
cout << "Введіть максимальне значення (b): ";
cin >> b;
cout << "Введіть кількість елементів (n): ";
cin >> n;
// Заповнення та виведення вектора
RandVect(vect, n, a, b);
cout << "Згенерований вектор: ";
PrintVect(vect);
// Пошук останнього від'ємного елемента за допомогою зворотного ітератора
auto rit = find_if(vect.rbegin(), vect.rend(), Neg);
if (rit != vect.rend()) {
// Конвертація зворотного ітератора у прямий
auto it = rit.base();
cout << "Останній від'ємний елемент: " << *(--it)
<< " (індекс " << distance(vect.begin(), it) << ")" << endl;
} else {
cout << "Error: від'ємні елементи відсутні" << endl;
}
return 0;
}
// Функція заповнення вектора випадковими числами
void RandVect(vector<int>& v, int n, int a, int b) {
v.resize(n);
for (int i = 0; i < n; ++i) {
v[i] = a + rand() % (b - a + 1);
}
}
// Функція виведення вектора
void PrintVect(const vector<int>& v) {
for (int num : v) {
cout << num << " ";
}
cout << endl;
}
// Предикат для пошуку від'ємних чисел
bool Neg(int x) {
return x < 0;
}
RandVect заповнює вектор випадковими числами.PrintVect показує згенерований вектор.rbegin(), rend())find_if з предикатом Negbase()
Введіть мінімальне значення (a): -5
Введіть максимальне значення (b): 5
Введіть кількість елементів (n): 8
Згенерований вектор: 2 -3 4 0 -1 5 -2 1
Останній від'ємний елемент: -2 (індекс 6)