I używa się składni C bardzo zwięzły i intuicyjny ++ znajdowania przecięcia dwóch sortowane vector
S i wkłada wynik w trzecim vector
:Co się stanie, jeśli użyję wektora :: begin() zamiast std :: back_inserter (wektor) dla wyjścia set_intersection?
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
ten powinien ustawić c
do przecięcia (a
, b
) zakładając, że a
i b
są posortowane.
Ale co, jeśli po prostu użyć c.begin()
(myślałem Widziałem gdzieś przykładem tego, co jest, dlaczego to zrobiłem):
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
set_intersection
oczekuje OutputIterator
w tym parametrze. Standard, jak sądzę, wymaga tylko, aby c.begin()
zwrócił wartość forward iterator
, która może być lub może nie być wartością OutputIterator
.
W każdym razie kod z c.begin()
skompilowany pod klang.
Co jest gwarantowane w ramach standardu? Jeśli to się kompiluje, co może się wydarzyć - to znaczy, kiedy iterator zwrócony przez c.begin()
zostanie w końcu zwiększony poza koniec wektora, a próba dostępu do wskazanego elementu, co musi/może się stać? Czy zgodna implementacja w tym przypadku w milczeniu może rozciągnąć wektor, tak że begin()
jest w rzeczywistości dołączanym OutputIterator
, takim jak back_inserter
?
Pytam o to przede wszystkim, aby zrozumieć, w jaki sposób standard współpracuje z iteratorami: co naprawdę się dzieje, więc mogę wyjść poza kopiowanie i wklejanie przy użyciu STL.
Czy 'Wektor' jest taki sam jak' std :: vector'? – Walter
@Walter Tak, naprawione, dzięki. – kdog