2012-10-05 9 views
6

में मूल्य का उपयोग कर रहा एक मान प्रकारमिलान कुंजी पाने के लिए एक नक्शा सी ++

map<int id, struct_t*> table 

struct_t 
{ 
int prev; 
int wt; 
string name; 
} 

केवल पिछला रूप में उपयोग करना struct के साथ एक नक्शा है, मैं इसी आईडी खोजने की जरूरत है। पहले से बहुत - बहुत धन्यवाद!

संपादित करें:

int key=0; 
for(auto it = table.begin(); it != table.end(); ++it) 
{ 
    if(table[(*it).first].prev == ?) 
} 

यह कैसे मेरे मानचित्र डेटा की तरह लग रहा है:

id prev abundance thing 
1573 -1  0  book 
1864 1573 39  beds 
2075 1864 41  tray 
1760 2075 46  cups 

प्रत्येक आईडी के लिए, मैं अगले मिलान आईडी खोजने की जरूरत है। इसलिए, पिछले कॉलम से 1573 के लिए मुझे एक मिलान 'आईडी' ढूंढना होगा जो कि 1864 है। इसके अलावा, std :: अगला काम नहीं करता है क्योंकि डेटा सेट में मिलान तत्वों को अगले तत्व में जरूरी नहीं है। उम्मीद है कि इससे मदद मिलती है !

कृपया मेरी मदद करें !!! मेरे मालिक पहले से ही निराश है कि मैं इतना समय C++ में जानने के लिए ले रहा हूँ

+0

'मानचित्र' की कुंजी क्या है? – hmjd

+0

क्या आपका मतलब डेटा प्रकार है? यह int id – snazziii

+3

मैप्स को उनकी चाबियों पर खोजा जाना है, मूल्यों के नहीं। शायद आपको अपने डिजाइन को ट्विक करना चाहिए या किसी अन्य प्रकार के कंटेनर का उपयोग करना चाहिए। – arnoo

उत्तर

5

हो सकता है यदि आपने (lambdas का समर्थन करता है), तो आप निम्न कर सकते हैं:

const int prevToFind = 10; 
auto findResult = std::find_if(std::begin(table), std::end(table), [&](const std::pair<int, struct_t*> &pair) 
{ 
    return pair.second->prev == prevToFind; 
}); 

int foundKey = 0; // You might want to initialise this to a value you know is invalid in your map 
struct_t *foundValue = nullptr 
if (findResult != std::end(table)) 
{ 
    foundKey = findResult->first; 
    foundValue = findResult->second; 

    // Now do something with the key or value! 
} 

मुझे पता है अगर आपके पास हैं एक पुराना कंपाइलर, और मैं इसके बजाय एक predicate कक्षा का उपयोग करने के लिए उदाहरण अद्यतन कर सकते हैं।

+0

मैं एक्सकोड का उपयोग कर रहा हूं इसलिए मेरे पास ऐप्पल एलएलवीएम 4.1 कंपाइलर – snazziii

+0

है, मुझे वास्तव में यह समझ में नहीं आ रहा है .. मुझे संरचना की आवश्यकता नहीं है, मुझे एक चीज की आवश्यकता है। – snazziii

+0

आप कुंजी चाहते हैं? ऐसा लगता है जैसे आपका नक्शा पीछे की ओर है ... यह उपर्युक्त कोड में एक आसान परिवर्तन है (बस findResult-> पहले का उपयोग करें)। –

3

सरल पाश यह कर सकते हैं (पहले से ही अपने किया गया 3 सप्ताह!):

#include <map> 
#include <string> 
#include <iostream> 

int main() 
{ 
    std::map<int, std::string> m = { 
     std::make_pair(0, "zero"), std::make_pair(1, "one"), std::make_pair(2, "two") 
    }; 

    int key = 0; 
    for (auto &i : m) { 
     if (i.second == "two") { 
     key = i.first; 
     break; // to stop searching 
     } 
    } 

    std::cout << key << std::endl; 
} 
बेशक

आप अपने खुद के सेट करने की आवश्यकता खोज के लिए if-statement। कृपया ध्यान दें, एक आधुनिक संकलक द्विदिश मानचित्र को बढ़ावा देने के लिए एक समाधान (boost::bimap)

+0

तो, मैंने उस दिशा को जोड़ा जिसमें मैं नेतृत्व कर रहा हूं, लेकिन मुझे नहीं पता कि मुझे कथन में क्या तुलना करनी चाहिए! – snazziii

+0

'if (i.second-> prev == the_id_youre_looking_for)' – Hendrik

+0

यह स्वीकार्य उत्तर की तुलना में मेरे लिए बहुत आसान लग रहा है। मुझे समझ में नहीं आता कि इसका कोई वोट नहीं था ... –

3

पाठ्यक्रम के नक्शे पर लूपिंग काम कर देता है, लेकिन आप एक सूचकांक के रूप में एक दूसरे मानचित्र का उपयोग पर विचार करना चाहते हो सकता है:

map<int,int> table_idx; 

जब भी आप table करने के लिए नए प्रविष्टियों को जोड़ने आप table_idx अपडेट करने के बारे आवश्यकता होगी , id संग्रहित करता है जो प्रत्येक prev से मेल खाता है। table_idx तो (एन) बार जब आप लॉग में id रिवर्स देखने के लिए अनुमति देगा:

int prev_for_id = table_idx[id]; 
+0

मानचित्र पर लूपिंग करके आपका क्या मतलब है? – snazziii

+0

मैं ऊपर दिए गए कुछ उत्तरों में अपनाए गए दृष्टिकोण का जिक्र कर रहा था: मानचित्र में प्रत्येक प्रविष्टि को फिर से शुरू करने तक जब तक आप उस मान को नहीं पाते जिसका 'prev' फ़ील्ड' आईडी 'के बराबर है जिसे आप ढूंढ रहे हैं। – Hendrik

1

इम एक लग रहा है कि आप अभी शुरुआत कर रहे हैं हो रही है, तो यह अच्छा होगा अगर आप हमें बताएंगे आपको बस इतना करना कोशिश कर रहे हैं क्योंकि शायद आप एक गलत समस्या को हल करने की कोशिश कर रहे हैं।
जैसा कि उल्लेख किए गए मानचित्रों को कुंजी द्वारा खोजा जाने के लिए डिज़ाइन किया गया है, मूल्य नहीं।
यह कहा जा रहा है कि यदि आप मानचित्र को इस तरह खोजने का आग्रह करते हैं तो आप संभावित रूप से बूस्ट बिमाप को जांचना चाहते हैं।

+0

हां, मैं एक नौसिखिया हूं। मैं इस परियोजना के साथ 3 सप्ताह के लिए संघर्ष कर रहा हूं! मैं – snazziii

+0

प्रश्न को ठीक कर दूंगा, मुझे लगता है कि आपकी समस्या समझ में आती है। मेरे सिर के शीर्ष में मैं पहले नक्शा में सभी डेटा डालता हूं (इसके बाद जोड़ा गया फ़ील्ड जिसमें प्रारंभ में प्रारंभिक प्रारंभ होता है)। फिर मैं पूरे मानचित्र से और प्रत्येक कुंजी के लिए जाउंगा जिसमें value.prev == वाई नक्शा है [वाई] -> value.next = X – NoSenseEtAl

+0

यह काम नहीं कर रहा है ... एक्स और वाई क्या हैं? – snazziii

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