2009-04-04 19 views
7

for_each acepta InputIterators:¿Se puede mutar objetos con std :: for_each?

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

¿Está bien para cambiar el objeto de la función f, de esta manera:

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

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

Este código funciona en VC++ 2008 y también con GCC, pero es también código portátil (legal)?
(InputIterators solamente se garantiza que sea utilizable como rvalue, en este caso se utilizan como valor-I en el operador de AddOne())

Respuesta

7

Lea este article.

Para ser pedante: for_each es una operación de secuencia no modificante. La intención no es modificar la secuencia. Sin embargo, es bien para modificar la secuencia de entrada cuando se usa for_each.

2

Es legal: los iteradores de entrada se usan para especificar el rango, no para hacer el procesamiento.

Curiosamente, Josuttis en su libro "La biblioteca estándar de C++" enumera for_each como modificante, más que no modificante.

4

Usted entiende mal algo. Decir que los iteradores de entrada solo se pueden usar como valores r no significa que no se pueda obtener un lvalue de un iterador de alguna manera. Por lo tanto, no significa que el resultado de *iterator sea un valor r. Lo que/for_each pasa a AddOne es el resultado de operator* - no el propio iterador.

Sobre for_each y un objeto función de modificación - Leer this question

3

En caso de duda el uso std :: transformar ya que incluso transmitir al lector ocasional de su código que tiene la intención de modificar algo.

Cuestiones relacionadas