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 [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 [*]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 originalvector<MyClass>::iterator donde(vector<MyClass>& v, int i){
return std::find_if(v.begin(),v.end(),
[i](const MyClass& item)
{ return item.getId() == i; });
}
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
C++11 ya incluye los incializadores de listas, lo que simplifica el trabajo de rellenar vectores con datos fijos:
Código C++:
Ver originalint main(){
// opción 1
vector<MyClass> v { MyClass(2), MyClass(8), MyClass(10) };
// opción 2
// esta opción funcionará siempre que el constructor
// MyClass::MyClass(int) no esté marcado como explicit
vector<MyClass> v { 2, 8, 10 };
vector<MyClass>::iterator it = donde(v, i);
it++;
it->setId(-8);
cin.sync();
cin.get();
return 0;
}
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.