Я использую высоко сжатый и интуитивный синтаксис C++ для нахождения пересечения двух отсортированных vector
с и положить результат в третьем vector
:Что произойдет, если я использую vector :: begin() вместо std :: back_inserter (vector) для вывода set_intersection?
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()
составлен под clang.
Что гарантируется в соответствии со стандартом? Если это скомпилируется, что может произойти - то есть, когда итератор, возвращенный на c.begin()
, в конечном итоге увеличивается до конца вектора, и делается попытка получить доступ к указанному элементу, что должно/может произойти? Может ли соответствующая реализация молча расширить вектор в этом случае, так что begin()
на самом деле является добавлением OutputIterator
, например back_inserter
?
Я прошу об этом в основном, чтобы понять, как стандарт работает с итераторами: что происходит, поэтому я могу перейти за рамки копирования и вставки в STL.
Является ли 'Вектор' таким же, как' std :: vector'? – Walter
@ Уолтер Да, исправлено, спасибо. – kdog