2013-01-05 12 views
6

मैं दोनों एंडपॉइंट्स सहित, [first, last] श्रेणी को विभाजित करना चाहता हूं। मैंfirst से पहले और last के तत्व को iterators की है। मैं इसे splice_after() के साथ कर सकता हूं लेकिन केवल रैखिक समय में।std :: forward_list के साथ निरंतर समय में रेंज स्प्लिस कैसे करें?

मैं इस जोड़ निरंतर समय में किया जा सकता belive। मैं इसे std::forward_list के साथ कैसे कर सकता हूं?

प्रश्न स्पष्ट नहीं है, यहाँ के रूप में मेरी समस्या दिखा एक उदाहरण कोड है:

कोड पर Live Work Space

#include <algorithm> 
#include <forward_list> 
#include <iostream> 
#include <iterator> 
using namespace std; 

int main() { 
    forward_list<char> trg{'a','b','c'}; 
    forward_list<char> src{'1','2','3','4'}; 

    auto before_first = src.begin(); 
    auto last = find(src.begin(), src.end(), '4'); 
    cout << "before_first = " << *before_first << ", last = " << *last << "\n"; 

    // trg.splice(trg.begin(), src, before_first, last); // no such splice 
    auto end = last; 
    ++end; // Ouch! splice has to find last again although I already had it :(
    trg.splice_after(trg.begin(), src, before_first, end); 

    cout << "Target after splice:\n"; 
    copy(trg.begin(), trg.end(), ostream_iterator<char>(cout," ")); 

    cout << "\nSource after splice:\n"; 
    copy(src.begin(), src.end(), ostream_iterator<char>(cout," ")); 

    cout << endl; 
} 

आउटपुट:

before_first = 1, last = 4 
Target after splice: 
a 2 3 4 b c 
Source after splice: 
1 
+0

जीसीसी libstdC++ निरंतर समय में इस करता है, लेकिन विजुअल C++ नहीं करता है। ([क्यों] (http://msdn.microsoft.com/en-us/library/vstudio/ee373562%28v=vs.110%29.aspx): _ अगर तीसरा सदस्य फ़ंक्शन एन तत्वों को सम्मिलित करता है, और दाएं! = यह , कक्षा पुनरावर्तक का एक वस्तु बढ़ी है N times_) – neam

+0

@tim आप यह कहां जीसीसी करते हैं? कृपया लिंक दें। – Ali

+0

[यहां] (http://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a00484.html#a90ae2ddea9cebf2b29f7399683dc3e20) (क्षमा करें मैं आपको लिंक देना भूल गया) – neam

उत्तर

5

forward_list के विनिर्देश का कहना है कि श्रेणी (first, last) को विभाजित किया जाना चाहिए, और दुर्भाग्य से ओ (1) समय में ऐसा करने का कोई तरीका नहीं है क्योंकि किसी कोतक पहुंच की आवश्यकता हैऐसा करने के लिए, और last-1 तक पहुंच प्राप्त करने का एकमात्र तरीका first से आगे बढ़ाना है।

कल्पना रेंज (first, last] ब्याह करने के लिए किया गया था, तो एक हे (1) जोड़ संभव हो जाएगा। मुझे वर्तमान forward_list spec के साथ इसे प्राप्त करने का कोई तरीका नहीं है।

मुझे लगता है कि यह एक दोष है। हालांकि मैं पहले से ही की कोशिश की है और इसे ठीक करने में विफल रहा है:

http://cplusplus.github.com/LWG/lwg-defects.html#897

हालांकि मुद्दों अतीत में उलट गया है, खासकर जब शिकायतों ऐसी खुद के रूप में गैर-समिति के सदस्यों से में आते हैं। शिकायत दर्ज करने का तरीका एक नया मुद्दा खोलना है, यदि उचित हो तो किसी पुराने या संबंधित मुद्दों का संदर्भ देना। किसी समस्या को खोलने के लिए निर्देश here हैं।

पीएस: प्रश्न पर +1।

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