2012-12-04 12 views
5

जैसा कि मैं इसे समझता हूं, unique_ptr अनन्य स्वामित्व का प्रतीक है। एक अकेले लिंक्ड सूची अगले, जैसे (pseduocode चेतावनी)unique_ptr <> के साथ एक सूची कार्यान्वित करना?

class node{ 
public: 
     unique_ptr<node> next; 
     int value; 
}; 

मालिक प्रत्येक नोड के साथ इस फिट करने के लिए, लगता है, लेकिन मुझे समझ नहीं आता कि कैसे सूची है, जहां मैं कर रहा करने के लिए इस्तेमाल कर रहा हूँ traversing जैसे कार्य करने

here=here->next; 

unique_ptr का उपयोग करके आप डेटा संरचनाओं को कैसे कार्यान्वित करते हैं? क्या वे नौकरी के लिए सही उपकरण हैं?

उत्तर

6

जब आप नोड्स के माध्यम से जाना है, तो आप नोड सूचक है, जिसका अर्थ ही की जरूरत नहीं है कि

यहाँ = यहाँ> अगले;

गलत है अगर यह एक अद्वितीय_ptr है। किसी ऑब्जेक्ट का स्वामित्व का अर्थ है "इसके जीवन और मृत्यु के लिए ज़िम्मेदार होना" जिसका अर्थ है मालिक ही वह व्यक्ति है जिसने ऑब्जेक्ट को नष्ट कर दिया है। यदि आप स्वामित्व की एक और परिभाषा का उपयोग करते हैं, तो यह नहीं है कि unique_ptr का अर्थ क्या है।

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

आप जो भी चाहते हैं उसके बिना पॉइंटर को पढ़ना है। ऐसा करने के लिए वर्तमान अच्छा अभ्यास एक कच्चे सूचक का उपयोग करना है जो इस कोड को देखने वाले अन्य डेवलपर्स को "उपयोग लेकिन स्वामित्व" का उपयोग करने का संकेत नहीं देता है (unique_ptr का अर्थ है "यदि मैं मर जाता हूं, तो बिंदु वस्तु भी मर जाती है"):

node* here = nullptr; // it will not own the pointed nodes (don't call delete with this pointer) 
here = &first_node(); // assuming first_node() returns a reference to the first node 
here = here->next.get(); // to get the next node without owning it: use get() - true in all smart pointers interface 
+0

मैं अगले के लिए ज़िम्मेदार नोड्स के लिए प्रतिबद्ध नहीं हूं, मैं सिर्फ यह पता लगाने की कोशिश कर रहा हूं कि कच्चे पॉइंटर्स और स्मार्ट पॉइंटर्स के बीच अनुवाद कैसे करें और यह सबसे प्रत्यक्ष लग रहा था। विकल्पों पर कोई सुझाव? –

+1

ठीक है मुझे लगता है कि shared_ptr का उपयोग करना अधिक महंगा होगा लेकिन इसे संभालना आसान होगा। नोड्स को अलग करना बहुत आसान होगा। ऐसा कहा जा रहा है कि एक अनुकूलित सूची कार्यान्वयन कच्चे पॉइंटर्स और कस्टम नोड आवंटन के साथ करेगा। – Klaim

+0

'std :: swap' के बारे में मत भूलना। –