2009-05-29 21 views
11

मेरे पास घटनाओं की प्राथमिकता कतार है, लेकिन कभी-कभी ईवेंट प्राथमिकताएं बदलती हैं, इसलिए मैं इवेंट अनुरोधकर्ताओं से हीप में हेरेटर्स को बनाए रखना चाहता हूं। यदि प्राथमिकता बदलती है, तो मैं लॉग (एन) समय में ढेर को समायोजित करना चाहता हूं। मैं हमेशा ढेर में प्रत्येक तत्व को इंगित करने वाला बिल्कुल एक इटरेटर होगा।क्या सी ++ में एक ढेर वर्ग है जो सिर के अलावा अन्य तत्वों की प्राथमिकता को बदलने का समर्थन करता है?

उत्तर

3

मुझे लगता है कि बूस्ट रिपोर्ट करने के लिए खुश हूँ के साथ अंत है अब stellar data structures के साथ Boost.Heap library जोड़ा गया है।

इसका लाभ यह है कि फाइबोनैकी लगातार निरंतर समय में प्राथमिकता को बदलने का समर्थन करता है।

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

2

ऐसा लगता है कि आपको अधिक संकेत की आवश्यकता है। प्राथमिकता कतार में घटनाओं के लिए पॉइंटर स्टोर करें। जब कतार परिवर्तन के कुछ तत्वों की प्राथमिकता, इसे हटा दें और पुन: सम्मिलित करें।

10

बूस्ट के mutable heaps पर एक नज़र डालें।

+0

धन्यवाद, अगर मैं अपना खुद का रोल करना चाहता हूं, तो मैं उस स्निपेट को शुरू करने के लिए उपयोग करूंगा। –

+1

इस समाधान के साथ समाप्त हो गया –

+1

@ फेर्रूसियो धन्यवाद, मेरे अच्छे 45 मिनट और कुछ कीड़े बचाए गए। –

0

यहाँ एक चेतावनी है कि आप छँटाई अस्थिर घटना, यानी एक ही प्राथमिकता के साथ घटनाओं के आदेश अपरिभाषित है (पढ़ा 'वे पुनर्क्रमित हो जाएगा'।)

+1

आप लॉग (एन) समय में एक ढेर से एक मनमाना तत्व को हटा सकते हैं। –

+0

हाँ, आप सही हैं, कुछ और के बारे में सोच रहे थे :) –

+0

कोई समस्या नहीं :) –