What happens if I use vector::begin() instead of std::back_inserter(vector) for output of set_intersection?

后端 未结 3 1317
天涯浪人
天涯浪人 2021-01-17 21:06

I have been using the highly concise and intuitive C++ syntax for finding the intersection of two sorted vectors and putting the result in a third vector<

3条回答
  •  清歌不尽
    2021-01-17 21:51

    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 like back_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.)

提交回复
热议问题