Что произойдет, если я буду использовать vector :: begin () вместо std :: back_inserter (vector) для вывода set_intersection?

Я использовал очень лаконичный и интуитивно понятный синтаксис C ++ для нахождения пересечения двух отсортированныхvectorи положить результат в третьемvector:

vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                      std::back_inserter(c));

Это должно установитьc до пересечения (a,b), предполагаяa а такжеb отсортированы.

Но что, если я просто используюc.begin() (Я думал, что видел пример где-то из этого, поэтому я и сделал):

 std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                       c.begin());

set_intersection ожидаетOutputIterator на этот параметр. Я считаю, что стандарт требует толькоc.begin() вернутьforward iterator, который я полагаю, может быть или не бытьOutputIterator.

Во всяком случае, код сc.begin() составлено под лязг.

Что гарантированно произойдет по стандарту? Если это скомпилируется, то, что может произойти, то есть когда итератор возвращаетсяc.begin() в конечном итоге увеличивается после конца вектора, и делается попытка получить доступ к указанному элементу, что должно / может произойти? Может ли соответствующая реализация молча расширить вектор в этом случае, чтобыbegin() на самом деле добавлениеOutputIterator лайкback_inserter является?

Я спрашиваю это главным образом, чтобы понять, как стандарт работает с итераторами: что на самом деле происходит, поэтому я могу выйти за рамки копирования и вставки при использовании STL.

Ответы на вопрос(3)

Ваш ответ на вопрос