我試圖編寫一個程序,其中給定了一個向量,使用迭代器比較向量的第一個和最後一個數字,然後移入並比較下一個。我寫了for循環來做到這一點,但我不確定如何使它在到達矢量中心時停下來。在C++中迭代通過矢量進行比較
對於for循環,我有:
for (a = v.begin(), b = v.rbegin(); a != v.end(), b != v.rend(); a++, b++)
其中a
是前向迭代和b
是向後迭代器。 我的假設是我需要改變for循環的條件,但我不確定是什麼。
我試圖編寫一個程序,其中給定了一個向量,使用迭代器比較向量的第一個和最後一個數字,然後移入並比較下一個。我寫了for循環來做到這一點,但我不確定如何使它在到達矢量中心時停下來。在C++中迭代通過矢量進行比較
對於for循環,我有:
for (a = v.begin(), b = v.rbegin(); a != v.end(), b != v.rend(); a++, b++)
其中a
是前向迭代和b
是向後迭代器。 我的假設是我需要改變for循環的條件,但我不確定是什麼。
請記住std::vector<T>::iterator
是random-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...
}
所有你需要使用&&
,而不是,
運營商的比較,首先其沒有做你認爲它的事情。
爲了您的具體問題,你剛纔繼續下去,直到兩個迭代器到達對方,你可以通過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;
}
你的意思是一些「is_palindrome」功能? – xtofl
至少,你應該改變條件使用'&&'。 – Iluvatar
您的循環條件'a!= v.end(),b!= v.rend()'使用逗號運算符來執行這兩個子表達式,但是第一個('a!= v.end() ')將被丟棄,只有第二個表達式的結果將被使用。至於「到達矢量的中心」,在這裏使用*索引*而不是迭代器可能更有意義。然後很容易看到索引是否通過向量長度的「中點」。 –