2013-11-28 3 views
1

Я начинаю изучать C++ и STL. У меня есть проблема:Шаблон палитрон функции, который принимает векторный параметр

Написать шаблон функции палиндром, которая принимает вектор параметр и возвращает истину или ложь, чтобы проверить, является ли вектор палиндром или нет (12321 является палиндром, 1234 не палиндром)

И это мой код:

template<class T> 
bool palindrome(vector<T> & v) 
{ 
    int i,j; 
    for(i=0,j=v.size();i<v.size()/2;i++,j--) 
    { 
     if(v[i]!=v[j]) 
     return false; 
    } 

    return true; 
} 

void main() 
{ 
    int ar[]={1,2,3,2,1}; 
    vector<int> v(ar,ar+5); 
    cout<<palindrome(v); 
} 

Код не работает. Я знаю, что у него есть некоторые ошибки, но я не знаю, как их исправить. Пожалуйста, помогите мне! Большое спасибо!

+0

Какое сообщение об ошибке? Какой результат вы ожидаете и какой результат вы получаете? – Syjin

+1

Попробуйте использовать итераторы 'rbegin', вместо использования size(), а не лучший способ итерации над вектором. – DumbCoder

+1

main должен возвращать int, а не пустоту. – RichardPlunkett

ответ

3

У вас неверные индексы. В вашей петле j=v.size(), а затем вы получите доступ к v[j]. Но последний элемент находится в индексе v.size() - 1. Поведение вашей программы будет неопределенным.

Изменения в j=v.size() -1

+0

, скорее, лучший ответ, чем мой, и быстрее. Но доступ к элементу за пределами массива для чтения редко приводит к краху выполнения. – RichardPlunkett

+0

да действительно ... У меня есть шляпа java. – UmNyobe

+0

О, это ошибка дурака. Большое спасибо. Код работал хорошо. –

2

Наиболее вопиющий ошибка в: for(i=0,j=v.size();i<v.size()/2;i++,j--)

Вам нужно j=v.size()-1

1

Или вы могли бы использовать свое мастерство в STL уплотнить его прямо вниз, а также его работать на списки и многое другое.

template<class T> bool palindrome(T & v){ 
    return std::equal(v.begin(),v.end(),v.rbegin()); 
} 
Смежные вопросы