Векторные итераторы для циклов, операторов возврата, предупреждения, c ++ - PullRequest
5 голосов
/ 10 июня 2010

У меня есть три вопроса относительно домашнего задания для 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

Что касается приведенного выше кода, можете ли вы иметь более одного итератора, объявленного в первой части цикла for? Я попытался определить «it» и «rit» в методе palindrome (), и я продолжал получать сообщение об ошибке «,» перед rit. Но когда я вырезаю и вставляю вне цикла for, ошибок компилятора нет. (Я использую VS 2008).

Второй вопрос, я просто пьянею по этому поводу. Но нормально ли то, что у меня есть мои операторы return в методе palindrome ()? В моей голове, я думаю, что это работает так, как только * it и * rit не равны друг другу, тогда функция возвращает false, и метод завершается в этой точке. В противном случае, если он проходит весь цикл for, он возвращает true в конце. Я полностью размышлял о том, как работают операторы return в случае блоков, и я попытался найти хороший пример в своей книге, но не смог его найти.

Наконец, я получаю это предупреждение:

\palindrome.h(14) : warning C4018: '<' : signed/unsigned mismatch

Это потому, что я запускаю цикл for до (i

Ответы [ 3 ]

8 голосов
/ 10 июня 2010

Являются ли итераторы обязательным домашним заданием? Эта задача может быть уменьшена до вызова std::equal:

template <class T>
bool palindrome(const std::vector<T> &input)
{
        return equal(input.begin(), input.begin()+input.size()/2, input.rbegin());
}
5 голосов
/ 10 июня 2010

можете ли вы иметь более одного итератора, объявленного в первой части цикла for?

Да, но оба они должны быть одного типа, поэтому нельзя объявить const_iterator и const_reverse_iterator.

как у меня есть мои операторы return в методе palindrome (), хорошо?

Да, хотя почему бы просто не сравнить *it != *rit?

palindrome.h(14) : warning C4018: '<' : signed/unsigned mismatch

i подписано;std::vector::size() возвращает значение без знака.Если бы i был без знака, вы бы не получили это предупреждение.

В качестве подсказки: возможно, было бы проще использовать два прямых итератора.Инициализируйте один для .begin(), а другой для .end() - 1.Затем вы можете увеличивать первое и уменьшать второе, и ваш цикл проверки просто становится it1 < it2.Что-то вроде следующего (полностью непроверенного) цикла for:

for (iterator it1(v.begin()), it2(v.end() - 1); it1 < it2; ++it1, --it2)

Таким образом, вам больше не нужен отдельный i счетчик и сравнения;все делается с помощью итераторов.

0 голосов
/ 10 июня 2010

Цикл 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; ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...