Volver vector::end()
, lanzar una excepción, o devolver algo más que un iterador llanura
Mejor aún, no implementar su propia función Find
. Para eso está la biblioteca <algorithm>
. Según su psudocódigo, probablemente pueda usar std::find
o std::find_if
. find_if
es particularmente útil en casos donde la igualdad no significa necesariamente operator==
. En esos casos, puede usar un lambda [C++ 11] o si C++ 11 no está disponible para usted, una clase ficticia.
Desde el funtor es el denominador común más bajo, voy a empezar con eso:
#include <cstdlib>
#include <string>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
class Person
{
public:
Person(const string& name, unsigned age) : name_(name), age_(age) {};
string name_;
unsigned age_;
};
class match_name : public unary_function <bool, string>
{
public:
match_name(const string& rhs) : name_(rhs) {};
bool operator()(const Person& rhs) const
{
return rhs.name_ == name_;
}
private:
string name_;
};
#include <iostream>
int main()
{
vector<Person> people;
people.push_back(Person("Hellen Keller", 99));
people.push_back(Person("John Doe", 42));
/** C++03 **/
vector<Person>::const_iterator found_person = std::find_if(people.begin(), people.end(), match_name("John Doe"));
if(found_person == people.end())
cout << "Not FOund";
else
cout << found_person->name_ << " is " << found_person->age_;
}
found_person
ahora apunta a la persona cuyo nombre es "John Doe", o bien puntos de people_.end()
si esa persona wasn no encontrado.
A C++ 11 lambda es la nueva sintaxis del lenguaje que hace que este proceso de declaración/definición de un funtor sea algo más simple en muchos casos. Se hace así:
string target = "John Doe";
vector<Person>::const_iterator found_person = std::find_if(people.begin(), people.end(), [&target](const Person& test) { return it->name_ == target; });
Si no tiene un motivo en particular para usar el suyo, considere 'std :: find'. Sin embargo, la forma en que se implementó es que devolvería 'end()'. – chris
Esto simplemente parece un defecto de diseño. Devuelve una copia, un puntero, un bool que indica el estado encontrado y modifica una instancia de entrada por referencia, ¡pero NO devuelve un iterador a un contenedor oculto! –
encontrar la complejidad es O (n). De hecho, estoy usando una búsqueda binaria de back-end para hacer la búsqueda. Esto es importante ya que estoy implementando un sistema distribuido muy grande. – mister