私は非常に簡潔で直感的な C++ 構文を使用して、2 つのソート済み の共通部分を見つけ、vector
その結果を 3 番目の に入れていvector
ます。
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
これは、がソートされていると仮定して、 c
intersection( a
, ) に設定する必要があります。b
a
b
しかし、単に使用するとどうなりますc.begin()
か (これのどこかで例を見たと思ったので、そうしました):
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
set_intersection
そのパラメータで を期待OutputIterator
します。私が信じている標準では、 a を返すことだけが必要c.begin()
です。forward iterator
OutputIterator
とにかく、c.begin()
clangの下でコンパイルされたコード。
標準で保証されていることは何ですか? これがコンパイルされた場合、何が起こる可能性がありますか?つまり、によって返されたイテレータc.begin()
が最終的にベクターの終わりを超えてインクリメントされ、ポイントされた要素にアクセスしようとすると、何が起こる必要がありますか? この場合、適合する実装はサイレントにベクトルを拡張できるのでbegin()
、実際には追加OutputIterator
のようなものback_inserter
ですか?
私は主に、標準がイテレータでどのように機能するかを理解するためにこれを求めています。つまり、実際に何が起こっているのかを理解して、STL を使用してコピーアンドペーストを超えて移動できるようにします。