वापसी vector::end()
, एक अपवाद फेंक, या वापसी अलावा कुछ एक सादे इटरेटर
की तुलना में बेहतर अभी तक, अपने स्वयं के Find
समारोह को लागू नहीं करते। <algorithm>
लाइब्रेरी के लिए यही है। आपके psudocode के आधार पर, आप शायद std::find
या std::find_if
का उपयोग कर सकते हैं। find_if
उन मामलों में विशेष रूप से उपयोगी है जहां समानता का मतलब operator==
नहीं है। उन मामलों में, आप एक [सी ++ 11] लैम्ब्डा का उपयोग कर सकते हैं या यदि सी ++ 11 आपके लिए उपलब्ध नहीं है, तो एक मजेदार वर्ग।
के बाद से functor सबसे कम आम विभाजक है, मैं उस के साथ शुरू करेंगे:
#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
अब व्यक्ति जिसका नाम "जॉन डो" है की ओर इशारा करता है, या यदि उस व्यक्ति नहीं दिया किसी और people_.end()
को इंगित करता है नहीं मिला
ए सी ++ 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; });
स्रोत
2012-05-09 19:33:39
यदि आपके पास स्वयं का उपयोग करने का कोई विशेष कारण नहीं है, तो 'std :: find' पर विचार करें। जिस तरह से इसे लागू किया गया है, यह है कि यह 'अंत() 'वापस करेगा। – chris
यह सिर्फ एक डिजाइन दोष की तरह लगता है। एक प्रतिलिपि, एक सूचक, एक बूल को मिला जो स्थिति को इंगित करता है और संदर्भ के माध्यम से एक इनपुट आवृत्ति संशोधित करता है, लेकिन एक छिपे हुए कंटेनर में एक इटरेटर वापस न करें! –
जटिलता ढूंढें ओ (एन) है। मैं वास्तव में खोज करने के लिए एक बैक एंड बाइनरी खोज का उपयोग कर रहा हूँ। यह बहुत महत्वपूर्ण है क्योंकि मैं एक बहुत ही विशाल वितरित प्रणाली को कार्यान्वित करता हूं। – mister