This SO question ha scatenato una discussione su std::generate
e le garanzie fatte dalla norma. In particolare, è possibile utilizzare gli oggetti funzione con stato interno e fare affidamento su generate(it1, it2, gen)
per chiamare gen()
, archiviare il risultato in *it
, chiamare di nuovo gen()
, archiviare in *(it + 1)
ecc. Oppure può avviarsi sul retro, ad esempio?Formulazione standard C++: "attraverso tutti gli iteratori nell'intervallo" implica sequenzialità?
Lo standard (n3337, §25.3.7/1) dice:
Effetti: Il primo algoritmo richiama l'oggetto funzione
gen
e assegna il valore restituito GEN attraverso tutti gli iteratori nell'intervallo[first,last)
. Il secondo algoritmo richiama la funzione oggetto gen e assegna il valore restituito di gen attraverso tutti gli iteratori nell'intervallo[first,first + n)
sen
è positivo, altrimenti non fa nulla.
Sembra che nessun ordinamento è garantito, soprattutto perché altri paragrafi hanno forte formulazione, ad esempio std::for_each
(Effetti: Si applica f
al risultato di dereferenziazione ogni iteratore nella gamma [first,last)
, a partire dalla prima e procedendo a last - 1
. Se stiamo prendendo questa lettera, si garantisce solo per iniziare a first
e terminerà alle last
anche se - non ci sono garanzie sul ordinamento in mezzo).
Ma: Sia Microsoft's e Apache's C++ standard library entrambi danno esempi sulle loro pagine di documentazione che richiedono la valutazione di essere sequenziale. E sia libC++ (in algorithm
) che libstdC++ (in bits/stl_algo.h
) lo implementano in questo modo. Inoltre, si perde un sacco di potenziali applicazioni per generate
senza questa garanzia.
Condivide la formulazione attuale implica sequenzialità? In caso contrario, si trattava di una svista dei membri del comitato o intenzionale?
(Sono ben consapevole che non ci sono molte persone che possono fornire risposte penetranti a questa domanda senza limitarsi a speculare o discutere, ma a mio modesto parere, questo non rende questa domanda "non costruttiva" come da linee guida SO .)
Grazie a @juanchopanza per sottolineare questo problema e mi riferimento al paragrafo relativo for_each
.
Non credo 'generate()' è molto utile se non è sequenziale. –
Credo che la vaghezza sia considerevolmente sollevata quando viene presa nel contesto dell'iteratore richiesto * classe * la funzione template lo richiede; ** 'template' **. Poiché sia il primo che l'ultimo sono solo in avanti, salvo per impilarli tutti in un vettore o in un costrutto vettoriale, quindi non saltare in sequenza sulla sequenza, non hai altra scelta che iniziare all'inizio e arrivare alla fine. –
WhozCraig
@WhozCraig Heh, l'ho assolutamente perso. A mio parere, questa è una risposta perspicace e dovresti postarla come tale. Ciononostante, sarei comunque interessato a sentire da persone vicine al comitato o agli implementatori delle biblioteche riguardo ai loro pensieri in merito. – us2012