2010-06-10 34 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