2012-04-21 4 views
3

前に、配列ではなく、要素の最初の要素を返す:http://www.cplusplus.com/reference/stl/map/rend/ それは言う:のstd ::マップ::レンド()このコードは、次の、私がのstd ::マップを反復処理を逆転しようとしている

rend()は、マップコンテナ内の最初の要素の直前の要素を参照する逆方向反復子を返します。逆方向反復子は、逆方向終端と見なされます。

rendはbeginと同じ要素を参照するのではなく、その直前の要素を参照することに注意してください。

map<float,int> m; 
m.insert(pair<float,int>(.1,0)); 
m.insert(pair<float,int>(.4,5)); 
map<float,int>::reverse_iterator rend=m.rend(); 
map<float,int>::iterator begin=m.begin(); 

私はこれを実行すると、両方レンドおよびmの最初の要素にポイントを始める、(.1,0)、それは、上記通知をしてはならない場合には明らか。非常に明白な間違いがあるように感じますが、何ができるのか理解できません。

(C++、MSVC2010)

rend
+1

'' rend''がそのアイテムを指しているとあなたはどのように判断していますか? – Mat

+0

これは明確な基準ではありません。どのような意味で、あなたはどこに虚偽を指しているのか決定しましたレンダリングを逆参照した場合、結果は無効です。これは未定義の動作です。 –

答えて

2

点が未定義の動作されること要素にアクセスします。コンテナ内の最初のアイテムを提供したり、アプリケーションをクラッシュさせたり、想像以上に何かをする可能性があります。この要素は、反復処理中にコンテナの終わりを知らせるためのプレースホルダです(さまざまな標準ライブラリコンテナのendにも同じことが適用されます)。

2

rendがどこを指しているかを確認する方法はわかりませんが、この例では主張を反駁しています。

int main() { 

    map<float,int> m; 
    m.insert(pair<float,int>(.1,0)); 
    m.insert(pair<float,int>(.4,5)); 
    map<float,int>::reverse_iterator rend=m.rend(); 
    map<float,int>::iterator begin=m.begin(); 

    for (rend=m.rbegin() ; rend != m.rend(); rend++) 
    cout << rend->first << " => " << rend->second << endl; 
} 

出力:

0.4 => 5 
0.1 => 0 
rend

は、最初の要素を指していた場合、=> 0〜0.1が印刷されないであろう。

これは私の例です。最初の要素を指し示す結論に実際に到達したコードを表示する必要があります。

+0

実際、私が問題と思っているのは 'rend()'と 'begin()'は同じ要素を指しているということです。しかし、あなたの例では、 'rend()'要素を印刷しません。 –

+0

@ArtakBegnazaryan:それは、rend()が印刷されていないからです。それは、リストの最後の要素を過ぎてスペースにアクセスして印刷しようとしているようなものです。私の例では、最初の要素を指さないので、ループは最初の要素で停止せず、最後に到達すると停止します。もしrendが実際にbeginと等しいならば、ループが等価で終了するので、最初の要素は印刷されません。 –

+0

@ArtakBegnazaryan:とにかくdownvotingに感謝します。 –

3

私はあなたが不足している点が、デバッガを使用して値を調べる場合、rend()begin()によって返された値が同じ値が含まれているということであると考えています。ただし、イテレータタイプのメンバーのoperator*は、依然として異なるオブジェクトへのアクセスを提供します。

技術的な詳細:rend()によって返される値は、begin()の前には指定できません。これは有効ではないためです。したがって、rend()にはbegin()の値が含まれ、他のすべての逆方向イテレータはさらに1ポジションだけシフトされることが決定されました。 operator*はこれを補正し、正しい要素にアクセスします。 24.5.1リバースイテレータの

最初の段落は言う:

クラステンプレートreverse_iteratorはその配列の先頭にその基礎となるイテレータで定義されたシーケンスの終わりからその反復処理するイテレータアダプタです。逆反復子とそれに対応する反復子iとの間の基本的関係は、同一性によって確立される。
&*(reverse_iterator(i)) == &*(i - 1)

関連する問題