палиндром через метод вектор
#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 шт):
Итераторы и обратные итераторы разные сущности, и потому их нельзя сравнивать, если не написан специальный оператор сравнения. Вам нужно сравнивать значения объектов на которых указывают эти итераторы, а не сами итераторы, поэтому вопрос поставлен не совсем корректно. Вы можете проверить "является ли последовательность палиндромом ?", разными способами, но всегда лучше назвать функцию подходящим именем и дать понять, что ничего не будете пытаться записывать(это всего лишь проверка). Например, сравнивая две половинки последовательностей:
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;
}
Что, по мне будет более эффективно.