Что произойдет, если я буду использовать 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.