戻るvector::end()
、例外をスローする、または単純なイテレータ以外のものを返す
Find
さらに良いことに、独自の関数を実装しないでください。それが<algorithm>
ライブラリの目的です。擬似コードに基づいて、おそらくstd::find
またはを使用できますstd::find_if
。 find_if
平等が必ずしも意味しない場合に特に役立ちoperator==
ます。そのような場合は、[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
「JohnDoe」という名前の人を指すようになりました。またはpeople_.end()
、その人が見つからなかった場合は指します。
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; });