2010-06-10 32 views
5

我有三个关于C++作业分配的问题。目标是创建一个简单的回文方法。这是我该模板:for循环中的向量迭代器,返回语句,警告,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”,并且在rit之前我一直在获取有关需要“,”的错误。但是当我在for循环之外剪切和粘贴时,编译器没有错误。 (我正在使用VS 2008)。

第二个问题,我几乎只是放在这个脑袋上。但是,我在回文()方法中返回语句的方式正确吗?在我的脑海中,我认为它的工作原理就是,一旦* it和* rit不相等,那么该函数返回false,此时方法退出。否则,如果它完全通过for循环,那么它在最后返回true。我完全的脑子里放着如何返回报表如何工作,如果块和我试图在我的书中查找一个很好的例子,我找不到一个。

最后,我得到这样的警告:

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

现在是因为我跑我的循环,直到(我< input.size()/ 2)和编译器告诉我,输入可以是负数?谢谢!

+1

你不需要声明你的函数模板为'static'。 – 2010-06-10 04:00:04

回答

5

你可以在for循环的第一部分声明多个迭代器吗?

是的,但他们都必须是同一类型的,所以你不能同时声明一个const_iteratorconst_reverse_iterator

是我有我的回文在回文()方法好吗?

是的,虽然为什么不只是比较*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

你最后的建议只适用于随机访问迭代器,因为只有那些支持减法。 – Tomek 2010-06-10 05:04:02

+0

@Tomek:对。 OP使用'std :: vector',它使用随机访问迭代器。你也可以使用'std :: prev()'(C++ 0x addition,但不重要)来获得最后一个元素的迭代器;那么需求就减少为双向迭代器。 – 2010-06-10 05:28:46

+1

你不能比较双向迭代器和其他任何东西,但是相等('=='和'!='可以,但不是'<)),所以需求仍然是随机访问迭代器。它可以被重写为仅使用相等比较,但是这需要移动循环体内的增量/减量(至少一个),并检查以避免迭代器在具有偶数个元素的容器中交叉。 – 2010-06-10 07:41:24

0

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; ...) 
8

就是迭代的家庭作业的要求?这个任务可以减少到std::equal的呼叫:

template <class T> 
bool palindrome(const std::vector<T> &input) 
{ 
     return equal(input.begin(), input.begin()+input.size()/2, input.rbegin()); 
} 
+0

骗子;-)(和+1 ...非常好的解决方案) – 2010-06-10 05:03:34