2010-01-08 7 views
7

के साथ स्ट्रक्चर के लिए स्ट्रक्चर के सी ++ एसडीडी वेक्टर खोजना मुझे यकीन है कि मैं इसे जितना कठिन बनाना चाहता हूं उससे ज्यादा कठिन बना रहा हूं।मेलिंग स्ट्रिंग

मैं एक सदिश है ...

vector<Joints> mJointsVector; 

... के बाद नमूनों structs के शामिल निम्नलिखित:

struct Joints 
{ 
    string name; 

    float origUpperLimit; 
    float origLowerLimit; 
}; 

मैं साथ mJointsVector खोज करने के लिए कोशिश कर रहा हूँ "std :: लगता है" अपने स्ट्रिंग नाम से एक व्यक्तिगत संयुक्त का पता लगाने के लिए - अब तक कोई किस्मत नहीं है, लेकिन निम्न के उदाहरणों ने कम से कम अवधारणात्मक रूप से मदद की है:

Vectors, structs and std::find

क्या कोई मुझे सही दिशा में आगे इंगित कर सकता है?

+1

नीचे जवाब अच्छी तरह से और अच्छे हैं, लेकिन आपका उपयोग 'Joints' को लगता है कि आप एक' बजाय map' का उपयोग करना चाहिए, जैसे 'स्ट्रिंग' से । यह आपके लुक-अप समय में भी सुधार करेगा। – GManNickG

+0

मुझे लगता है कि आप शायद सही हैं - मुझे इसे बाद में देखना होगा। –

+0

वाह, मानचित्र और मल्टीमैप्स * महान हैं! विशेष रूप से * for_each * लूप के बजाय फ़ंक्शन ऑब्जेक्ट्स का उपयोग करके! http://www.codeproject.com/KB/stl/replace_for_for_each.aspx?display=Print इस तरह लूप कोड को "पुन: उपयोग" करने में सक्षम होने के लिए उपयोगी है। –

उत्तर

16

एक सीधी-सपाट-दृष्टिकोण:

struct FindByName { 
    const std::string name; 
    FindByName(const std::string& name) : name(name) {} 
    bool operator()(const Joints& j) const { 
     return j.name == name; 
    } 
}; 

std::vector<Joints>::iterator it = std::find_if(m_jointsVector.begin(), 
               m_jointsVector.end(), 
               FindByName("foo")); 

if(it != m_jointsVector.end()) { 
    // ... 
} 

वैकल्पिक रूप से आप Boost.Bind की तरह कुछ की जांच के लिए कोड की मात्रा को कम कर सकते हैं।

+2

यह काम करता है, मुझे लगता है कि एक फंक्शन ऑब्जेक्ट का ऑपरेटर() हमेशा लचीलापन के लिए होना चाहिए। यदि एक दिन आपके पास कॉन्स जोड़ों की एक श्रृंखला है, तो फ़ंक्शन ऑब्जेक्ट अभी भी काम करता है। – vividos

+0

यह केवल तभी काम करता है जब मैं "बूल ऑपरेटर (" से "बूल ऑपरेटर() (" बदलता हूं क्या यह सही है? मुझे यह करने के लिए कितने तरीके हैं! –

+0

ओह, मुझे पहले याद आया कोष्ठक - निश्चित। –

0
bool 
operator == (const Joints& joints, const std::string& name) { 
    return joints.name == name; 
} 

std::find(mJointsVector.begin(), mJointsVector.end(), std::string("foo")); 
1

आप एक ऑपरेटर के बराबर होती है जोड़ने के लिए सक्षम होना चाहिए अपने struct

struct Joints 
{ 
    std::string name; 

    bool operator==(const std::string & str) { return name == str; } 
}; 

तो फिर तुम खोज का उपयोग करके खोज कर सकते हैं।

+0

है, समानता ऑपरेटर को परीक्षण के लिए आरक्षित किया जाना चाहिए यदि एक ही प्रकार की दो वस्तुएं बराबर हैं। केवल अन्य दुर्लभ रूप से आप अन्य प्रकारों की तुलना करने के लिए इसका उपयोग कर सकते हैं। –

+0

मन बताता है कि एक स्रोत क्यों है या उद्धृत करता है? –

+0

इस सरल संक्षिप्त उत्तर में कई कमियां हैं: आपको मुफ्त फ़ंक्शन ऑपरेटर को अधिक पसंद करना चाहिए सदस्य फ़ंक्शन ऑपरेटर (कुछ संचालन में प्रकारों के संबंध में समरूपता), यदि आप अधिभार == आपको ओवरलोड भी करना चाहिए! =, और आखिरकार मार्टिन ने इंगित किया कि, ऑपरेटर को अधिभारित करते समय आपको अर्थशास्त्र को नहीं बदला जाना चाहिए। ऑपरेटर प्रतीक पाठक को कुछ अर्थशास्त्र का तात्पर्य है, अगर उन अर्थशास्त्रों को उपयोगकर्ता कोड में त्रुटियों की संभावनाओं को तोड़ दिया जाता है।कौन सोच सकता है कि '= = बी बी' विभिन्न वस्तुओं के लिए सच साबित होगा? –

5

तरीके के बारे में:

std::string name = "xxx"; 

std::find_if(mJointsVector.begin(), 
      mJointsVector.end(), 
      [&s = name](const Joints& j) -> bool { return s == j.name; }); 
+0

उह, क्या? यह अभी तक समर्थित नहीं है: पी (फिर भी, मुझे लगता है कि यह गलत है।) – GManNickG

+7

यह गलत नहीं है, यह सही है और कुछ वर्षों के समय में, यह उत्तर दूसरों की तुलना में "अधिक" सही के रूप में देखा जाएगा । –

+0

डारिड, आपका क्या मतलब है? यह और सही क्यों है? आपको चुनौती नहीं दे रहा है - मैं वास्तव में पूरी तरह से अनजान हूं - और उत्सुक हूं। –

0
struct Compare: public unary_function <const string&> 
{ 
    public: 
      Compare(string _findString):mfindString(_findString){} 
      bool operator() (string _currString) 
      { 
       return _currString == mfindString ; 
      } 
    private: 
      string mfindString ; 
} 

std::find_if(mJointsVector.begin(), mJointsVector.end(), Compare("urstring")) ; 
+0

आपने कभी '_currString' या' _findString' घोषित नहीं किया है और आपकी विरासत गलत है (टेम्पलेट पैरामीटर सटीक) –

+0

यह इंगित करने के लिए धन्यवाद। मैंने इसे सही किया है – mukeshkumar

1
#include <boost/bind.hpp> 

std::vector<Joints>::iterator it; 

it = std::find_if(mJointsVector.begin(), 
        mJointsVector.end(), 
        boost::bind(&Joints::name, _1) == name_to_find); 
संबंधित मुद्दे