2009-04-04 16 views
7

for_each accetta InputIterators:È consentito modificare gli oggetti con std :: for_each?

//from c++ standard 
template <class InputIterator, class Function> 
    Function for_each (InputIterator first, InputIterator last, Function f); 

E 'ok per cambiare l'oggetto in funzione f, in questo modo:

struct AddOne 
{ 
    void operator()(int & x){x = x + 1;} 
}; 

std::vector<int> vec(10); 
std::for_each(vec.begin(),vec.end(),AddOne()); 

Questo codice funziona in VC++ 2008 e anche con GCC, ma è anche un codice (legale) portatile?
(InputIterators sono garantite solo per essere utilizzabile come rvalue, in questo caso vengono usati come valore assegnabile in operatore di AddOne())

risposta

7

leggi questo article.

Per essere pedante: for_each è un'operazione di sequenza non modificabile. L'intento non è quello di modificare la sequenza. Tuttavia, è è ok per modificare la sequenza di input quando si utilizza for_each.

2

È legale: gli iteratori di input vengono utilizzati per specificare l'intervallo, non per l'elaborazione.

È interessante notare che Josuttis nel suo libro "The C++ Standard Library" elenca for_each come modifica, raher di non modificabile.

4

Hai frainteso qualcosa. Dire che gli input iterator sono garantiti per essere utilizzabili in quanto rvalues ​​non significa che non si possa ottenere un lvalue da un iteratore in qualche modo. Pertanto, ciò non significa che il risultato di *iterator sia un valore rvalue. Ciò che tu/for_each passa a AddOne è il risultato di operator* - non l'iteratore stesso.

proposito for_each e un oggetto funzione modifica - leggi this question

3

In caso di dubbio uso std :: trasformarlo in quanto sarà trasmettere anche al lettore casuale del codice che si intende modificare qualcosa.

Problemi correlati