палиндром через метод вектор

#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>

using namespace std;

vector<int>Nums;
vector<int>::iterator it;
vector<int>::reverse_iterator rt;

void input(vector<int>& Nums, int n) {
   while (n)
   {
       int x;
       cin >> x;
       Nums.push_back(x);
       n = n - 1;
   }
}

void print(vector<int>& Nums)
{
   for ( it = Nums.begin(); it != Nums.end(); it++)
       cout <<* it << " ";
}
bool par(vector<int>& nums) {
   int size = nums.size() / 2;
   for (it = nums.begin(); it != nums.end();  it++) {
       for ( rt = nums.rbegin(); rt != nums.rend();  rt++) {
           if (it != rt) {
               return false;
           }
       }
   }
   return true;
}
int main()
{
   setlocale(LC_ALL, "russian");
   srand(time(NULL));
   cout<< "Количество элементов в векторе :"<< endl;
   int n;
   cin >> n;
   vector<int>Nums;
   cout<< "Исходный вектор"<< endl;
   input(Nums, n);
   cout << " "<< endl;
   if (par(Nums) == true)
       printf("палендром");
   else
       printf("не является палендромом");
}   

не понимаю как проверить равен итератор обратному итератору или нет на данный момент выдаёт ошибку отсутствует оператор "!=",соответствующий этим операндам


Ответы (1 шт):

Автор решения: AR Hovsepyan

Итераторы и обратные итераторы разные сущности, и потому их нельзя сравнивать, если не написан специальный оператор сравнения. Вам нужно сравнивать значения объектов на которых указывают эти итераторы, а не сами итераторы, поэтому вопрос поставлен не совсем корректно. Вы можете проверить "является ли последовательность палиндромом ?", разными способами, но всегда лучше назвать функцию подходящим именем и дать понять, что ничего не будете пытаться записывать(это всего лишь проверка). Например, сравнивая две половинки последовательностей:

bool is_palindrome(const vector<int>& v)
{
    const size_t sz = v.size() / 2;
    return vector<int>(v.begin(), v.begin() + sz)
       //тут использование обратного итератора подходяще
        == vector<int>(v.rbegin(), v.rbegin() + sz);
}

Или же сравнивая значения по парно, так, чтобы итераторы не покидали свой диапазон, и тут никакого обратного итератора нет нужды задействовать:

bool is_palindrome(const vector<int>& v)
{
    for (auto first = v.begin(),
        last = v.end(); first < last;  ++first)
        if (*first != *--last)
            return false;
    return true;    
}

Что, по мне будет более эффективно.

→ Ссылка