У меня есть три вопроса относительно присвоения домашней работы для C++. Цель состояла в том, чтобы создать простой метод палиндрома. Вот мой шаблон для этого:
#ifndef PALINDROME_H
#define PALINDROME_H
#include <vector>
#include <iostream>
#include <cmath>
template <class T>
static bool palindrome(const std::vector<T> &input)
{
std::vector<T>::const_iterator it = input.begin();
std::vector<T>::const_reverse_iterator rit = input.rbegin();
for (int i = 0; i < input.size()/2; i++, it++, rit++)
{
if (!(*it == *rit)) {
return false;
}
}
return true;
}
template <class T>
static void showVector(const std::vector<T> &input)
{
for (std::vector<T>::const_iterator it = input.begin(); it != input.end(); it++) {
std::cout << *it << " ";
}
}
#endif
Относительно вышеупомянутого кода у Вас может быть больше чем один итератор, объявленный в первой части для цикла? Я пытался определить и "это" и "rit" в палиндроме () метод, и я продолжил получать ошибку о необходимости"", прежде rit. Но когда я вырезал и вставил вне для цикла, никаких ошибок из компилятора. (Я использую VS 2008).
Второй вопрос, я в значительной степени просто мозг пукнул на этом. Но путь, у меня есть свои операторы возврата в палиндроме () метод хорошо? В моей голове я думаю, что она работает как, однажды *она и *rit не равняется друг другу, затем функция возвращает false и выходы метода в этой точке. Иначе, если это идет полностью через для цикла, затем это возвращает true в конце. Я полностью мозговой пукнул о том, как операторы возврата работают в том, если блоки и я пытались искать хороший пример в моей книге, и я не мог бы найти тот.
Наконец, я получаю это предупреждения:
\palindrome.h(14) : warning C4018: '<' : signed/unsigned mismatch
Теперь то, что, потому что я выполняю мой для цикла до (я <input.size ()/2) и компилятор, говорит мне, что вход может быть отрицательным?Спасибо!
можно ли объявить более одного итератора в первой части цикла for?
Да, но они оба должны быть одного типа, поэтому вы не можете объявить одновременно const_iterator
и const_reverse_iterator
.
- это то, как у меня есть операторы return в методе palindrome (), хорошо?
Да, но почему бы просто не сравнить * it! = * Rit
?
palindrome.h (14 ): предупреждение C4018: '<': несоответствие подписанного / неподписанного
i
подписан; std :: vector :: size ()
возвращает значение без знака. Если i
не подписан, вы не получите это предупреждение.
Однако в качестве предложения: может быть проще использовать два прямых итератора. Инициализируйте один как .begin ()
, а другой - как .end () - 1
. Затем вы можете увеличить первое и уменьшить второе, и ваша проверка цикла просто станет it1
for (iterator it1(v.begin()), it2(v.end() - 1); it1 < it2; ++it1, --it2)
Таким образом, вам больше не нужен отдельный счетчик i
и сравнения; все делается с помощью итераторов.
Обязательны ли итераторы для домашнего задания? Эту задачу можно свести к вызову std :: equal
:
template <class T>
bool palindrome(const std::vector<T> &input)
{
return equal(input.begin(), input.begin()+input.size()/2, input.rbegin());
}
Цикл for
работает для меня, когда итераторы одного типа, я еще не придумал другого способа - кроме инициализации их снаружи, как вы сделали:
typedef vector<char>::const_iterator IT;
for (IT it(vchars.begin()), end(vchars.end()); it != end; ++it)
{
cout << *it << endl;
}
Что касается оператора return, ваши рассуждения верны, но вы начинаете с того, что эти два итератора не одинаковы, один начинается спереди, другой с конца. Поэтому на первой итерации они не равны, и вы возвращаете false - я полагаю.
И последнее, предупреждение указывает на то, что size()
возвращает беззнаковый тип (размер не может быть отрицательным), но вы сравниваете со знаковым значением i
, что в большинстве случаев не является реальной проблемой - но для аккуратности вы можете объявить ваши i
как беззнаковые.
Это исправит ситуацию:
for (unsigned int i = 0; i < input.size()/2; ...)