Ver Mensaje Individual
  #4 (permalink)  
Antiguo 08/02/2016, 17:14
dmorill
 
Fecha de Ingreso: junio-2014
Mensajes: 144
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Incrementar un iterador de un vector<MyClass>

Eferion siempre presente y activo en el foro, me alegro mucho de contar contigo. Es impresionante la cantidad de cosas que se pueden aprender buscando otras jeje (yo que pensaba que ya medio dominaba lo básico de c++ ).

Cita:
Iniciado por eferion Ver Mensaje
[HIGHLIGHT="C++"]vector<MyClass>::iterator [*]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.
Que es el mantenimiento de código? he buscado por google pero no encuentro nada especifico, supongo que tiene que ver con la métrica del código.

Cita:
Iniciado por eferion Ver Mensaje
[*]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.[/LIST]
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. }
Super, no sabía que existía este tipo de funciones. en el find_if que lleva 3 argumentos, los dos primeros son iteradores y el tercero según cplusplus es un UnaryPredicate (función que transforma el contendido de un elemento a booleano según entiendo) y tu pones un [I](const MyClass& item), lo que no entiendo es que significa ese "[i]" y entre paréntesis una clase que pasas por referencia. Los [] son operadores para entrar en ciertos contenedores tipo "v[3]" y luego con los paréntesis ya me volví loco jajaja, pues creí que solo servían para llamar a funciones o para separar operaciones matemáticas largas.

Cita:
Iniciado por eferion Ver Mensaje

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. }
Hay algunos ejemplos en internet que mencionan más o menos los diferentes usos de explicit, podrías explicarme un poco más qué es y cuando se puede usar?

Muchas gracias de nuevo por tu tiempo y paciencia. Un saludo desde Colombia.