當我們反向迭代時,我看到大多數人使用以下結構:
for (auto it = vec.rbegin(); it != vec.rend(); it )
{
// block of code //
}
但是很長一段時間,我對使用這個有疑問,想知道為什么下面的代碼不起作用。
正如我們所知,最后一個元素的索引將比陣列中任何元素的索引最高,并且陣列將占用連續的記憶體。
我的主要疑問是當向后迭代時,我們為什么不使用it--?
我想知道以下代碼不起作用的原因。我正在從 運行回圈rbegin,這是最后一個元素,我將一直運行到第一個元素。我it在每次迭代中減一。
for (auto it = vec.rbegin(); it >= vec.begin(); it--)
{
cout << *it << endl;
}
即使下面的代碼也不起作用,為什么?
for(auto it = vec.rbegin(); it >= vec.begin(); it )
{
cout << *it << endl;
}
uj5u.com熱心網友回復:
首先,在給定的代碼中,for 回圈的條件由于型別不匹配而出現問題。
vec.rbegin()給出std::vector::reverse_iterator,vec.begin()給出std::vector::iterator; _ 這些是不同的型別,無法比較。因此,您會在這些地方遇到編譯器錯誤。
向后迭代時,我們為什么不使用
it--?
請參閱以下參考圖片
當你使用 時rbegin(),你從最后一個元素開始。為了進一步推進(就像每個迭代器實作一樣),它使用operator . 這里的前進意味著,向后迭代,因為起點是最后一個元素。因此,您應該使用it or it代替。
然而,對于最后一個 for 回圈示例,只有型別不匹配問題。使用?std::reverse_iterator::base(),您可以將反向迭代器獲取/轉換為相應的基本迭代器,并且可以將其與vec.begin().
這意味著以下更改將使其作業:
for (auto it = vec.rbegin(); it.base() != vec.begin(); it)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
std::cout << *it << " ";
}
查看演示
旁注:
- 盡管以上是可能的,但我強烈建議使用相同的迭代器進行比較,這樣可以使代碼看起來更自然,并且易于開發人員理解并且不易出錯。
- ?閱讀更多:我可以將反向迭代器轉換為正向迭代器嗎?
uj5u.com熱心網友回復:
反向迭代器被設計為模仿前向迭代器(并且迭代器通常被設計為模仿指標),因此演算法可以以不可知的方式撰寫,適用于這兩種型別。所有迭代器都隨著 前進operator 和遞減operator--,其中
前向迭代器向前推進并向后遞減
反向迭代器向后前進并向前遞減
uj5u.com熱心網友回復:
總而言之,這只是一個設計問題,設計師就是begin這樣設計的。rbeginendrend
以具有三個元素的容器為例{1,2,3}。
begin()指向1,end()指向后面的位置3rbegin()指向3,rend()指向之前1的位置。
您可以將其理解 rbegin()為特殊指標(又名iterator)的特殊資料結構,這樣 運算子將被多載到-.
您可以但不建議混合rbegin()使用,begin()因為它們是不同的東西。在大多數情況下,混合總是容易出錯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520464.html
