2012-12-24 23 views
5

कहो मैं इस तरह एक वेक्टर है:सी ++ एक एसटीडी में खोज :: वेक्टर

vector< pair<string, pair<int, int> > > cont; 

अब मैं cont में चाहते ELEM जो "ABC" करने के लिए अपने first के बराबर है पाते हैं। मैं इसे आसानी से मज़ेदार और एल्गोरिदम के साथ कैसे कर सकता हूं जो एसटीएल हमें प्रदान करता है (find_if, is_equal ??)। (कोई बूस्ट कृपया और कोई नया सी ++।)

संपादित करें: क्या यह संभव है एक विधेय functor को परिभाषित करने के बिना करना है?

+1

के लिए अनुमान उत्पन्न करती है आपने इसे स्वयं कहा: 'std :: find_if'। आप इसे लैम्ब्डा के साथ भी जोड़ सकते हैं। – chris

+0

क्यों सी ++ 11 के लिए नफरत है? – nikhil

+0

कोई नफरत नहीं है, हम इसे प्यार करते हैं! :) – Narek

उत्तर

7

कुछ

तरह
typedef std::pair<std::string, std::pair<int, int> > pair_t; 

struct Predicate : public std::unary_function<pair_t, bool> 
{ 
public: 
    Predicate(const std::string& s):value(s) { } 
    result_type operator() (const argument_type& pair) 
    { 
     return pair.first == value; 
    } 
private: 
    std::string value; 
}; 

std::vector<pair_t>::const_iterator pos = std::find_if(cont.begin(), cont.end(), 
Predicate("ABC")); 

या लैम्ब्डा, अगर सी ++ 11।

auto pos = std::find_if(cont.begin(), cont.end(), 
[](const std::pair<std::string, std::pair<int, int>>& pair) 
{ 
    return pair.first == "ABC"; 
}); 

वास्तव में, संरचना के बिना ऐसी चीज करने का एक अच्छा तरीका नहीं है।

typedef std::pair<std::string, std::pair<int, int> > pair_t; 

namespace std { 
template<> 
bool operator ==<> (const pair_t& first, const pair_t& second) 
{ 
    return first.first == second.first; 
} 
} 

std::vector<pair_t>::const_iterator pos = std::find_if(cont.begin(), cont.end(), 
std::bind2nd(std::equal_to<pair_t>(), std::make_pair("ABC", std::make_pair(1, 2)))); 
+0

पुराने मानक के साथ कृपया – Narek

+0

अच्छे समाधानों के लिए धन्यवाद। क्या यह भविष्यवाणी को परिभाषित किए बिना ऐसा करना संभव है? – Narek

+0

@ नरेक, हां, हार्डकोड स्ट्रिंग "एबीसी" द्वारा। – ForEveR

1

आप तेजी से O(N) खोज से की जरूरत है, तो आप की जगह ले सकता vector map साथ (या समानांतर जोड़ने) O(log N) खोज (या unordered_map साथ O(1)), कोई functor की जरूरत है के लिए:

vector<pair<string, pair<int,int>>> cont {{"ABC",{1,11}}, {"DFG",{2,22}}}; 
map  <string, pair<int,int>> M(cont.begin(), cont.end()); 
cout << M["ABC"] << endl; 

और RO library (शर्मनाक प्लग) का उपयोग करके, यह केवल होगा:

#include <sto/sto.h> 
using namespace sto; 

... 
auto it = cont/(_0=="ABC"); 

यहां / ओवरलोडेड सेशन जो आंतरिक रूप से find_if पर कॉल करता है; _0 - एसटीओ लैम्ब्डा अभिव्यक्ति में ट्यूपल (या जोड़ी) के पहले तत्व का संदर्भ; _0=="ABC" - लैम्ब्डा अभिव्यक्ति जो find_if

+0

अनॉर्डर्ड डेटा संरचनाएं धीमी होने की संभावना है आदेश दिया गया डेटा-स्ट्रक्चर, यह दूसरी तरफ एक वेक्टर और स्मृति में एक आवंटित आवंटन के लिए अनुदान निर्भर करता है, कभी-कभी, वास्तव में विस्तारित हो सकता है ensive। – user1849534

संबंधित मुद्दे