Sono stato con la sintassi altamente concisa ed intuitivo C++ per trovare l'intersezione di due filtrate vector
s e ponendo il risultato in una terza vector
:Cosa succede se uso vector :: begin() invece di std :: back_inserter (vector) per l'output di set_intersection?
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
Questo dovrebbe impostare c
all'intersezione (a
, b
), supponendo che a
e b
siano ordinati.
Ma cosa succede se mi basta usare c.begin()
(ho pensato che ho visto un esempio da qualche parte di questo, che è il motivo per cui ho fatto io):
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
set_intersection
aspetta un OutputIterator
a quel parametro. Lo standard credo che richiede solo che c.begin()
restituisca un forward iterator
, che suppongo potrebbe o non potrebbe essere un OutputIterator
.
In ogni caso, il codice con c.begin()
è compilato in clang.
Che cosa è garantito per lo standard? Se questo viene compilato, è probabile che ciò accada, ovvero quando l'iteratore restituito da c.begin()
viene infine incrementato oltre la fine del vettore e viene effettuato un tentativo di accesso all'elemento puntato su, che cosa deve/può accadere? Può un'implementazione conforme estendere in modo silenzioso il vettore in questo caso, quindi OutputIterator
come OutputIterator
è ?
Lo chiedo principalmente per capire come funziona lo standard con gli iteratori: cosa sta succedendo davvero, quindi posso andare oltre il copia-e-incolla nell'utilizzo dell'STL.
'Vector' è lo stesso di' std :: vector'? – Walter
@Walter Sì, corretto, grazie. – kdog