2016-12-05 63 views
0

我試圖編寫一個程序,其中給定了一個向量,使用迭代器比較向量的第一個和最後一個數字,然後移入並比較下一個。我寫了for循環來做到這一點,但我不確定如何使它在到達矢量中心時停下來。在C++中迭代通過矢量進行比較

對於for循環,我有:

for (a = v.begin(), b = v.rbegin(); a != v.end(), b != v.rend(); a++, b++) 

其中a是前向迭代和b是向後迭代器。 我的假設是我需要改變for循環的條件,但我不確定是什麼。

+0

你的意思是一些「is_palindrome」功能? – xtofl

+1

至少,你應該改變條件使用'&&'。 – Iluvatar

+0

您的循環條件'a!= v.end(),b!= v.rend()'使用逗號運算符來執行這兩個子表達式,但是第一個('a!= v.end() ')將被丟棄,只有第二個表達式的結果將被使用。至於「到達矢量的中心」,在這裏使用*索引*而不是迭代器可能更有意義。然後很容易看到索引是否通過向量長度的「中點」。 –

回答

1

請記住std::vector<T>::iteratorrandom-access iterator,這意味着它已定義operator<

利用這一點,並使用std::reverse_iterator<Iterator>::base()成員函數,我們可以重寫你的for循環以下幾點:

auto a = v.begin(); 
auto b = v.rbegin(); 
for (; a < b.base(); ++a, ++b) 
{ 
    // Do stuff... 
} 
1

所有你需要使用&&,而不是,運營商的比較,首先其沒有做你認爲它的事情。

爲了您的具體問題,你剛纔繼續下去,直到兩個迭代器到達對方,你可以通過std::reverse_iterator獲得base()的底層std::iterator,如:

template<typename T> bool isPalindrome(const std::vector<T>& data) 
{ 
    for (auto it = data.begin(), it2 = data.rbegin(); it != data.end() && it2 != data.rend() && 
      it != it2.base(); ++it, ++it2) 
     if (*it != *it2) 
      return false; 

    return true; 
}