Возвращение vector::end()
, бросить исключение или вернуть что-то иное, чем обычный итератор
еще лучше, не реализовать свою собственную Find
функции. Для этого нужна библиотека <algorithm>
. На основе вашего psudocode вы, вероятно, можете использовать std::find
или std::find_if
. find_if
особенно полезен в случаях, когда равенство необязательно означает operator==
. В этих случаях вы можете использовать lambda [C++ 11] или если C++ 11 недоступен для вас, класс функтора.
Поскольку функтор является наименьшим общим знаменателем, я начну с этим:
#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
теперь указывает на человека, имя которого «John Doe», или же указывает на people_.end()
, если этот человек WASN Не нашел.
C++ 11 лямбда - новый синтаксис языка, который делает этот процесс объявления/определения функтора и использования для многих случаев несколько проще. Это делается так:
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; });
Если у вас нет особых причин использовать свои собственные, рассмотрите 'std :: find'. Способ, которым он реализован, заключается в том, что он вернет 'end()'. – chris
Это похоже на дефект дизайна. Верните копию, указатель, bool, указывающий найденный статус, и измените экземпляр ввода через ссылку, но НЕ возвращайте итератор в скрытый контейнер! –
найти сложность O (n). Я действительно использую двоичный поиск в конце, чтобы выполнить поиск. Это важно, поскольку я внедряю очень огромную распределенную систему. – mister