2017-01-05 5 views
1

には、099の100個の値が含まれています。 the following考える:C++ dequeイテレータのスマートはどのくらいですか

ベクトルは、dequeのが 連続した記憶場所にあるすべての要素を格納することが保証されていないとは異なり

: によって両端キュー内の要素にアクセスするには、別の要素へのポインタを相殺するには、未定義の動作が発生します。

以下の行が有効ではありません表示されます。

int invalidResult = *(d.begin() + 81); // might give me 81, but NOT GUARANTEED, right? 

私の質問はこれです:イテレータがこのの世話をするのでしょうか? 1点で

std::deque<int>::iterator it = d.begin(); 
int isThisValid = *(it + 81); // 81 every time? or does it result in undefined behavior? 

、私はイテレータは基礎となるストレージのいずれかの不連続を扱うだろうと思っていたが、今私はよく分かりません。明らかに、あなたがit++を81回使用した場合、*itはあなたに81を与えるでしょう。

誰かが確実に言うことができますか?

私はC++ 11を使用していません。

+3

"**ポインタ**をオフセットする"の部分は、 'd.begin()+ 81'と何が関係していますか? –

+0

dequeイテレータがランダムアクセスであるかどうか尋ねていますか?はい。そうです。 –

+0

@KerrekSBだから、彼らは「要素のアドレスを取ってそこから相殺しない」と言おうとしているのですか? – kmort

答えて

7

それは、以下の行を表示され、有効ではありません。逆に

int invalidResult = *(d.begin() + 81); // might give me 81, but NOT GUARANTEED, right? 

。ステートメントは完全に有効で、動作は保証されています(d.size() >= 82と仮定します)。これは、std::deque::beginがポインタではなくイテレータを返すため、引用符付きのルールは適用されないためです。

std::deque<int>::iterator it = d.begin(); 
int isThisValid = *(it + 81); // 81 every time? or does it result in undefined behavior? 

これはあなたの代わりに、一時的なイテレータの名前の変数を、使用したことを除いて、ほとんど同等の前のコードにあります。その振る舞いはまったく同じです。ここで


はあなたがいないかもしれないものの例です。

int* pointer = &d.front(); 
pointer[offset] = 42; // oops 
+0

よろしくお願いします。イテレータは不連続性を透過的に処理することができてうれしいです。これは、私が見ているバグを別の場所で見なければならないことを意味します。ありがとう! – kmort

関連する問題