Вперед Зміст

Зворотний ітератор

Щоб знайти останній елемент з якоюсь властивістю було б зручно користуватися цією ж функцією 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;
}

Пояснення роботи програми:

  1. Введення параметрів: Програма запитує діапазон [a, b] та кількість елементів n.
  2. Генерація вектора: Функція RandVect заповнює вектор випадковими числами.
  3. Виведення вектора: Функція PrintVect показує згенерований вектор.
  4. Пошук останнього від'ємного:
    • Використовується зворотний ітератор (rbegin(), rend())
    • Алгоритм find_if з предикатом Neg
    • Конвертація зворотного ітератора у прямий через base()
  5. Виведення результату: Виводиться значення та індекс елемента або повідомлення про помилку.

Приклад роботи програми:


Введіть мінімальне значення (a): -5
Введіть максимальне значення (b): 5
Введіть кількість елементів (n): 8
Згенерований вектор: 2 -3 4 0 -1 5 -2 1 
Останній від'ємний елемент: -2 (індекс 6)

Вперед Зміст