2008-09-27 14 views
10

list::splice() का 3-तर्क फ़ॉर्म एक सूची से दूसरे में एक तत्व को स्थानांतरित करता है। SGI's documentation स्पष्ट रूप से बताता है कि सभी iterators, तत्व को इंगित करने वाला एक बिंदु मान्य रहता है। Roguewave's documentationsplice() विधियों के इटरेटर अमान्यता गुणों के बारे में कुछ भी नहीं कहता है, जबकि सी ++ मानक स्पष्ट रूप से बताता है कि यह सभी इटरेटर और विभाजन के तत्वों को संदर्भित करता है।splice() std :: list और iterator अमान्यता

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

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

मैं इस समस्या के आसपास कैसे काम कर सकता हूं? या मुझे सिर्फ व्यावहारिक होना चाहिए और मेरे सिर को रेत में छूना चाहिए (क्योंकि विभाजन अभ्यास में इटरेटर्स को अमान्य नहीं करता है - एमएस के कार्यान्वयन में भी नहीं, एक बार इटरेटर डीबगिंग बंद हो जाता है)।

+0

महान सवाल। अंतिम शब्द क्या था? –

+0

मानक बेवकूफ है, लेकिन सही है। मानक-अनुरूप कार्यक्रमों में splice का उपयोग न करें। शायद सी ++ 1x स्थिति में संशोधन किया; मैंने चेक नहीं किया है – zvrba

+5

मैंने अभी चेक किया है, यह बदलता है। शब्द बरकरार रखा गया है एलडब्ल्यूजी दोष 250 में से एक है: पुराना इटरेटर वैध हैं, और व्यवहार करते हैं जैसे वे नए कंटेनर को इंगित कर रहे हैं। –

उत्तर

9

ठीक है, यह this और this लिंक के अनुसार, मानक में एक दोष प्रतीत होता है। ऐसा लगता है कि "रेत में सिर चिपकाना" एक अच्छी रणनीति है, क्योंकि इसे नए पुस्तकालय संस्करणों में तय किया जाएगा।

2

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

मेरी राय में एक बेहतर तरीका है कि पहले और बाद में इसे स्थानांतरित करने वाले तत्वों को इंगित करने वाले इटरेटर का उपयोग करना।

+0

इस बात पर निर्भर करता है कि क्या वह हेरेटर को सूची में हेरफेर क्षमता खोने के बिना तत्वों तक पहुंचने के लिए रखता है या फिर वह सूची में फिर से चल रहा है, इस मामले में उसे वास्तव में सावधान रहना होगा। – Fruny

0

मेरे पास सूचियों की एक सरणी है (तत्वों के समकक्ष वर्ग), और मैं सूचियों के बीच तत्वों को स्थानांतरित करने के लिए splice का उपयोग कर रहा हूं। मेरे पास इटरेटर की एक अतिरिक्त सरणी है जो मुझे किसी भी सूची में किसी भी तत्व के लिए सीधे पहुंच प्रदान करती है और इसे किसी अन्य सूची में ले जाती है। किसी भी सूची में किसी भी सूची की खोज और संशोधित नहीं किया जाता है। मैं विभाजन के बाद तत्व इटरेटर को फिर से शुरू कर सकता हूं, लेकिन यह थोड़ी बदसूरत है .. मुझे लगता है कि मैं उस समय के लिए ऐसा करूँगा।