2013-03-04 3 views
5

मैं एक छोटे से जावा पृष्ठभूमि के साथ C++ में जानने के लिए कोशिश कर रहा हूँ, और मैं कोड है कि दो सूचियों के चौराहे रिटर्न लिखने के लिए कोशिश कर रहा हूँ में बदलने सूचकांक-वाक्य रचना। मेरा मानना ​​है कि मेरे पास अवधारणा का सही विचार है, लेकिन सिंटैक्स में परेशानी हो रही है क्योंकि कुछ भी संकलित नहीं है।शुरुआती सी ++: इटरेटर-वाक्य रचना

#include <iostream> 
using namespace std; 
#include <list> 

template <typename Object> 
list<Object> intersection(const list<Object> & L1, const list<Object> & L2){ 

    std::list<Object> result;     
    int pos1 = 0; 
    int pos2 = 0; 

    while (pos1 < L1.size() && pos2 < L2.size()) { 
    if (L1[pos1] > L1[pos2]) { 
     pos1++; 
    } else if (L2[pos2] > L1[pos1]) { 
     pos2++; 
    } else { 
     result.push_back(L2[pos2]); 
     pos1++; 
     pos2++; 
    } 
    } 
    return result; 

} 

चीजें मुझे लगता है कि मैं जरूरत: पुनरावर्तक (मुझे यकीन है कि जिस तरह से मैं इस सूची तक पहुँचने कर रहा हूँ सही नहीं है कर रहा हूँ)

+1

मैंने शीर्षक (उम्मीदवार) को और अधिक वर्णनात्मक बनाने के लिए शीर्षक संशोधित किया है, और यह इंगित करने के लिए कि यह अपेक्षाकृत सामान्य मुद्दा है, जो भविष्य के उपयोगकर्ताओं के लिए दिलचस्प है। मुझे उम्मीद है कि यह ठीक है (अगर नहीं तो कृपया वापस करें)। – jogojapan

+1

चूंकि आप सी ++ में शुरुआती हैं, इसलिए यह उल्लेखनीय हो सकता है कि आपको वास्तव में 'std :: list' ... का उपयोग नहीं करना चाहिए। (ऐसा नहीं है क्योंकि सी ++ वर्ग में कुछ भी गलत है, लेकिन क्योंकि यह एक भयानक डेटा संरचना है)। जब आपको केवल एक कंटेनर की आवश्यकता होती है, तो इसके बजाय 'वेक्टर ' के लिए डिफ़ॉल्ट। (इससे आपके कोड को इटरेटर्स की बजाय इंडेक्स के साथ काम करने की इजाजत मिल जाएगी) – jalf

+0

अच्छा बिंदु। ज्यादातर अवसरों में 'वेक्टर' बेहतर होता है, लेकिन मुझे लगता है कि 'सूची' और 'वैक्टर' दोनों के फायदे और नुकसान जानने के लिए अच्छा है और यदि आप किसी बिंदु पर अच्छा सी ++ कोड लिखना चाहते हैं तो आपको पॉइंटर्स/इटरेटर्स के बारे में जानना होगा। – Ari

उत्तर

4

यहाँ कोड मैं के साथ आए हैं है

pos1 बदलें और pos2 iterators रहे हैं:

list<Object> intersection(const list<Object> & L1, const list<Object> & L2){ 
    std::list<Object> result;     
    std::list<Object>::iterator pos1 = L1.begin(), pos2 = L2.begin(); 
    while (pos1 != L1.end() && pos2 != L2.end()) { 
    if (*pos1 > *pos2) { //works only if pos1 != L1.end() and pos2 != L2.end() 
     pos1++; 
     ... 

pos1 = L1.begin() अंक L1 के पहले तत्व को pos1

++pos1 चाल आगे iterator, अगले तत्व के लिए अगर pos1 सूची के अंत तक पहुँच

*pos1pos1

pos1 != L1.end() चेकों से तत्व हो जाता है। आप pos1 जब pos1 == L1.end() से तत्व नहीं ले सकते।

+0

आपको बहुत धन्यवाद, यह वही है जो मुझे चाहिए था। –

+1

इटरेटर को 'const' होना चाहिए। –

2

आप एक const_iterator नहीं एक iterator की जरूरत है।

सभी सी ++ कंटेनर कक्षाएं have typedefs on them चीजों को परिभाषित करने जैसी चीजों को परिभाषित करती हैं, और अन्य चीजों के साथ इटेटरेटर प्रकार।

अपने मामले list<Object>::value_type में प्रकार Object की है। तो आप कह सकते हैं:

list<Object>::value_type object = Object(); 

इसी list<Object>::iterator कंटेनर traversing के लिए इस्तेमाल किया इटरेटर का प्रकार है। आप begin() और end() का उपयोग करके iterators शुरुआत और कंटेनर के अंत का प्रतिनिधित्व कर सकते हैं।

यदि आपका कंटेनर अपने प्रश्न में के रूप में const है, begin और अंत नहीं लौटते iterator वे लौट const_iterator। आप इसे iterator प्रकार पर असाइन नहीं कर सकते हैं। वे अलग हैं क्योंकि आप मूल्य को संशोधित करने की अनुमति देते हैं, दूसरा नहीं।

आप const_iterator का उपयोग करके अपने इस समस्या को ठीक कर सकते हैं। हालांकि, इसे ठीक करने के कई अन्य तरीके हैं।

  • auto का मतलब है कि आपको इस प्रकार के बारे में स्पष्ट नहीं होना चाहिए। यह आपके लिए सही चीज है।
  • टेम्पलेट जेनेरिक पैरामीटर का उपयोग कर सकते हैं, फिर, आपको स्पष्ट होने की आवश्यकता नहीं है।
  • मानक पुस्तकालय में विभिन्न एल्गोरिदम हैं जो आप जो चाहते हैं वह पहले से ही कर सकते हैं (उदा। set_intersection)।
संबंधित मुद्दे