2009-04-04 7 views
7

for_each accepte InputIterators:Est-il acceptable de muter des objets avec std :: for_each?

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

est-il autorisé à changer l'objet en fonction f, comme ceci:

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

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

Ce code fonctionne en VC++ 2008 et aussi avec GCC, mais est-ce aussi portable (légal) code?
(InputIterators ne sont garantis d'être utilisables comme rvalue, dans ce cas, ils sont utilisés comme lvalue dans l'opérateur de ajouterUn())

Répondre

7

Lire cette article.

Pour être pédant: for_each est une opération de séquence non-modifiante. L'intention n'est pas de modifier la séquence. Cependant, il est peut modifier la séquence d'entrée lors de l'utilisation for_each.

2

Il est légal - les itérateurs d'entrée sont utilisés pour spécifier la plage, pas pour effectuer le traitement. Fait intéressant, Josuttis dans son livre "La bibliothèque standard C++" répertorie for_each comme modification, plutôt que non-modifiable.

4

Vous avez mal compris quelque chose. Le fait de dire que les itérateurs d'entrée ne sont garantis que comme valeurs ne signifie pas que vous ne pouvez pas obtenir une valeur d'un itérateur d'une manière ou d'une autre. Cela ne signifie donc pas que le résultat de *iterator est une valeur. Ce que vous/for_each passe à AddOne est le résultat de - pas l'itérateur lui-même.

A propos for_each et un objet fonction de modification - lire this question

3

En cas de doute utiliser std :: transformer comme il transmettra même au lecteur occasionnel de votre code que vous avez l'intention de modifier quelque chose.

Questions connexes