Código C++:
Ver originalvector<MyClass>::iterator donde(vector<MyClass>& v, int i){
vector<MyClass>::iterator it;
for (it = v.begin(); it != v.end(); it++){
if (it->getId() == i) return it;
}
return it;
}
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 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; });
}
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 originalint main(){
vector<MyClass> v;
v.push_back(MyClass(2));
v.push_back(MyClass(8));
v.push_back(MyClass(10));
vector<MyClass>::iterator it = donde(v, i);
it++;
it->setId(-8);
cin.sync();
cin.get();
return 0;
}
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;
}
Un saludo.