Ver Mensaje Individual
  #3 (permalink)  
Antiguo 03/02/2016, 01:37
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: Incrementar un iterador de un vector<MyClass>

Código C++:
Ver original
  1. vector<MyClass>::iterator donde(vector<MyClass>& v, int i){
  2.     vector<MyClass>::iterator it;
  3.     for (it = v.begin(); it != v.end(); it++){
  4.         if (it->getId() == i) return it;
  5.     }
  6.     return it;
  7. }

Un par de consideraciones sobre esa función:
  • Poner dos return en una función tan sencilla es algo a evitar. El índice de mantenimiento del código suele empeorar si una función tiene más de un return. La excepción a esa regla se suele dar si la función es larga y los return se deben a chequeos previos a ejecutar el código de la función.
  • Existe la función find_if que te permite eliminar el for... si bien escribes un poquito más de código éste es menos propenso a errores (por ejemplo que se borre el '!' de la condicional del for.

Una primera aproximación podría ser:

Código C++:
Ver original
  1. vector<MyClass>::iterator donde(vector<MyClass>& v, int i){
  2.     return  std::find_if(v.begin(),v.end(),
  3.                          [i](const MyClass& item)
  4.                          { return item.getId() == i; });
  5. }

Y ahora, con respecto a tu main, ignorando el hecho de que i no está ni declarada pero asumo que en tu código su uso es correcto, ...

Código C++:
Ver original
  1. int main(){
  2.     vector<MyClass> v;
  3.     v.push_back(MyClass(2));
  4.     v.push_back(MyClass(8));
  5.     v.push_back(MyClass(10));
  6.        
  7.     vector<MyClass>::iterator it = donde(v, i);
  8.     it++;
  9.     it->setId(-8);
  10.      
  11.     cin.sync();
  12.     cin.get();
  13.     return 0;
  14. }

C++11 ya incluye los incializadores de listas, lo que simplifica el trabajo de rellenar vectores con datos fijos:

Código C++:
Ver original
  1. int main(){
  2.     // opción 1
  3.     vector<MyClass> v { MyClass(2), MyClass(8), MyClass(10) };
  4.  
  5.     // opción 2
  6.     // esta opción funcionará siempre que el constructor
  7.     // MyClass::MyClass(int) no esté marcado como explicit
  8.     vector<MyClass> v { 2, 8, 10 };
  9.          
  10.     vector<MyClass>::iterator it = donde(v, i);
  11.     it++;
  12.     it->setId(-8);
  13.      
  14.     cin.sync();
  15.     cin.get();
  16.     return 0;
  17. }

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.