Векторные итераторы в для циклов, операторов возврата, предупреждения, C++

У меня есть три вопроса относительно присвоения домашней работы для 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) и компилятор, говорит мне, что вход может быть отрицательным?Спасибо!

5
задан Bill the Lizard 20 September 2012 в 12:51
поделиться

3 ответа

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

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

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

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

 palindrome.h (14 ): предупреждение C4018: '<': несоответствие подписанного / неподписанного

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

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

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

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

5
ответ дан 18 December 2019 в 14:42
поделиться

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

template <class T>
bool palindrome(const std::vector<T> &input)
{
        return equal(input.begin(), input.begin()+input.size()/2, input.rbegin());
}
8
ответ дан 18 December 2019 в 14:42
поделиться

Цикл 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; ...)
0
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: