I have been using the highly concise and intuitive C++ syntax for finding the intersection of two sorted vector
s and putting the result in a third vector<
The important requirement for an output iterator is that it be valid and write-able for the range [out, out+
size of output)
.
Passing c.begin()
will lead to the values being overwritten which only works if the container c
holds enough elements to overwrite. Imagine that c.begin()
returns a pointer to an array of size 0 - then you'll see the problem when writing *out++ = 7;
.
back_inserter
adds every assigned value to a vector
(via push_back
) and provides a concise way of making the STL-algorithms extend a range - it overloads the operators that are used for iterators appropriately.
Thus
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
invokes undefined behavior once set_intersection
writes something to its output iterator, that is, when the set intersection of a
and b
isn't empty.
Can a conforming implementation silently extend the vector in this case, so that begin() is in fact an appending
OutputIterator
likeback_inserter
is?
Of course. It's undefined behavior. (This is a humorous approach of telling you that you shouldn't even consider using this, no matter the effects on any implementation.)