2009-03-15 16 views
16

मैं सी को कुछ सी ++ कोड पोर्ट कर रहा हूं। सी में std :: मानचित्र का व्यवहार्य समतुल्य क्या है? मुझे पता है कि सी में कोई समकक्ष नहीं है।पोर्टिंग std :: मानचित्र से सी?

सी ++ में:

std::map< uint, sTexture > m_Textures; 

ग में:

यह मैं क्या का उपयोग कर के बारे में सोच रहा हूँ

typedef struct 
{ 
    uint* intKey; 
    sTexture* textureValue; 
} sTMTextureMap; 

कि व्यवहार्य है या मैं बहुत अधिक नक्शे को सरल बनाने रहा हूँ? बस अगर आपको इसका उद्देश्य एक बनावट मानचित्र नहीं मिला है।

उत्तर

18

uthash "सी संरचनाओं के लिए उपयोग में आसान हैश तालिका।"
के माध्यम से: http://en.wikipedia.org/wiki/Hash_table

+0

ओपी नहीं, लेकिन यह दिलचस्प लगता है! +1 :) –

0

सी में कोई मानक पुस्तकालय नहीं है जो मानचित्र के अनुरूप कार्यक्षमता प्रदान करता है। आपको कुछ प्रकार के कंटेनर का उपयोग करके अपनी नक्शा जैसी कार्यक्षमता को लागू करने की आवश्यकता होगी जो कुंजी के माध्यम से तत्वों तक पहुंच का समर्थन करता है।

+0

मुझे पता है कि मैं पूछ रहा हूं कि आप एक अच्छे उपयोग के बारे में जानते हैं? – kthakore

5

यह निश्चित रूप से एक संभव कार्यान्वयन है। आप इस बात पर विचार करना चाहेंगे कि आप इंडेक्सिंग को कैसे कार्यान्वित करेंगे और इसका क्या प्रभाव असर होगा। उदाहरण के लिए, आप intKey सूची कुंजी की एक क्रमबद्ध सूची हो सकती है। एक कुंजी खोजना ओ (लॉग एन) समय होगा, लेकिन एक नया आइटम डालने से ओ (एन) होगा।

आप इसे एक पेड़ (जैसे std :: map) के रूप में कार्यान्वित कर सकते हैं, और फिर आपके पास ओ (लॉग एन) सम्मिलन और लुकअप होगा।

एक और विकल्प इसे हैश टेबल के रूप में कार्यान्वित करना होगा, जिसमें बेहतर रनटाइम प्रदर्शन होगा, एक अच्छा हैश फ़ंक्शन और एक स्पैस पर्याप्त intKey सरणी मान लेगा।

+0

क्या आप इस कार्यान्वयन के लिए कोई ओपन सोर्स प्रोजेक्ट कर रहे हैं? – kthakore

+0

एक अच्छा पठन-काला पेड़ कार्यान्वयन ओपनबीएसडी में से एक है। यह एक ही हेडर फ़ाइल में फिट बैठता है और किसी भी संरचना के लिए इस्तेमाल किया जा सकता है। देखें http://www.openbsd.org/cgi-bin/cvsweb/src/sys/sys/tree.h – quinmars

0

dbopen आदमी

फ़ाइल तर्क के रूप में शून्य प्रदान करें और यह एक में स्मृति केवल कुंजी/मान डेटा के लिए कंटेनर हो जाएगा।

इसी तरह की कुंजी/मूल्य कार्यक्षमता के साथ विभिन्न बर्कले डेटाबेस लाइब्रेरी इंटरफेस भी हैं (मैन डीबीएम, स्लीपैट से बर्कलेडीबी देखें, कुछ खोजों को आजमाएं, आदि)।

+0

हालांकि टेक्स्टिंग के लिए ओवरकिल लगता है ... – kthakore

3

हालांकि आप इसे चुन सकते हैं। यदि आप एक लिंक-सूची दृष्टिकोण का उपयोग करते हैं तो आपका सम्मिलन ओ (1) होगा लेकिन आपका पुनर्प्राप्ति और हटाना ओ (एन) होगा। यदि आप लाल-काले पेड़ की तरह कुछ अधिक जटिल उपयोग करते हैं तो आपके पास बेहतर औसत प्रदर्शन होगा।

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

और एक प्रश्न का उत्तर देने के लिए आपने यह नहीं पूछा: शायद आपको फिर से यह पता लगाना चाहिए कि सी ++ से सी को पोर्ट करना वास्तव में आपके द्वारा प्रदान किए जाने वाले सभी लाभ प्रदान करता है या नहीं। निश्चित रूप से ऐसे हालात हैं जहां यह आवश्यक हो सकता है, लेकिन बहुत से लोग नहीं हैं।

21

कई सी कार्यान्वयन tsearch (3) या hsearch (3) का समर्थन करते हैं। tsearch (3) एक बाइनरी पेड़ है और आप एक तुलनित्र कॉलबैक प्रदान कर सकते हैं। मुझे लगता है कि आप करीब के करीब के रूप में एक std :: मानचित्र पर जा रहे हैं।

यहाँ कुछ c99 उदाहरण कोड

#include <search.h> 
#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 

typedef struct 
{ 
     int key; 
     char* value; 
} intStrMap; 

int compar(const void *l, const void *r) 
{ 
    const intStrMap *lm = l; 
    const intStrMap *lr = r; 
    return lm->key - lr->key; 
} 

int main(int argc, char **argv) 
{ 
    void *root = 0; 

    intStrMap *a = malloc(sizeof(intStrMap)); 
    a->key = 2; 
    a->value = strdup("two"); 
    tsearch(a, &root, compar); /* insert */ 

    intStrMap *find_a = malloc(sizeof(intStrMap)); 
    find_a->key = 2; 

    void *r = tfind(find_a, &root, compar); /* read */ 
    printf("%s", (*(intStrMap**)r)->value); 

    return 0; 
} 
+0

धन्यवाद, tsearch महान है। –

+0

@matt_h क्या मैं इसे एक char [] के साथ एक कुंजी के रूप में उपयोग कर सकता हूं? – Giuseppe

+1

सुनिश्चित करें, आप बस 'strcmp (lm-> key, lr-> key)' जैसे कुछ का उपयोग करके तुलना लिखेंगे। –

10

आप क्यों नहीं बस std::map के चारों ओर एक सी इंटरफेस रैप नहीं है? मैं अपने स्वयं के मॉड्यूल में कुछ सी ++ फ़ंक्शन लिखता हूं:

typedef std::map<int, char*> Map; 

extern "C" { 

void* map_create() { 
    return reinterpret_cast<void*> (new Map); 
} 

void map_put(void* map, int k, char* v) { 
    Map* m = reinterpret_cast<Map*> (map); 
    m->insert(std::pair<int, char*>(k, v)); 
} 

// etc... 

} // extern "C" 

और फिर अपने सी ऐप में लिंक करें।

2

मैं सी में एक नक्शा को लागू करने की कोशिश की है, यह शून्य *

http://code.google.com/p/cstl/

यह कार्य प्रगति पर है पर आधारित है, लेकिन नक्शे पूरा हो गया है।

http://code.google.com/p/cstl/source/browse/src/c_map.c

यह लाल काले ट्री के आधार पर लिखा है।

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