Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में कॉम्बिनेशन के लिए इटरेटर


मान लीजिए हमें एक इटरेटर क्लास डिज़ाइन करनी है, जिसमें कुछ ऑपरेशन्स हों -

  • एक कंस्ट्रक्टर परिभाषित करें जो सॉर्टेड डिस्टिंक्ट लोअरकेस इंग्लिश लेटर्स की एक स्ट्रिंग characters और एक नंबर combinationLength को पैरामीटर के रूप में लेता है।
  • next() नामक एक फंक्शन परिभाषित करें जो अल्फाबेटिक क्रम में combinationLength लंबाई का अगला कॉम्बिनेशन लौटाता है।
  • hasNext() नामक एक और फंक्शन परिभाषित करें जो तभी True लौटाता है जब अगला कॉम्बिनेशन मौजूद हो।

यदि इनपुट इस प्रकार है -

CombinationIterator iterator = new CombinationIterator("xyz", 2); iterator.next(); // returns "xy" iterator.hasNext(); // returns true iterator.next(); // returns "xz" iterator.hasNext(); // returns true iterator.next(); // returns "yz" iterator.hasNext(); // returns false

इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -

  • स्ट्रिंग्स का एक ऐरे comb और इंडेक्स idx बनाएं
  • makeCombs() नामक एक मेथड परिभाषित करें, जो स्ट्रिंग s, इंटीजर वेरिएबल l, एक टेम्प स्ट्रिंग लेगा, जो प्रारंभ में खाली है, और स्टार्ट, जो प्रारंभ में 0 है। यह इस प्रकार परिभाषित है -
  • यदि temp का आकार = l है, तो temp को comb में डालें और लौटें
  • i के लिए स्टार्ट से s के आकार तक की रेंज में
    • makeCombs(s, l, temp + s[i], i + 1)
  • printVector() मेथड स्ट्रिंग्स के ऐरे को इनपुट के रूप में लेगा, यह उस ऐरे के एलिमेंट्स को डिस्प्ले करेगा
  • कंस्ट्रक्टर को इस प्रकार परिभाषित करें: यह स्ट्रिंग c और cl लेगा,
  • makeCombs(c, cl) कॉल करें, idx := 0 सेट करें
  • next() मेथड idx को बढ़ाएगा और comb[idx - 1] लौटाएगा
  • hasNext() मेथड true लौटाएगा यदि idx comb के आकार के समान नहीं है, अन्यथा false।

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित इम्प्लीमेंटेशन देखें -

#include <bits/stdc++.h> using namespace std; class CombinationIterator { public:    vector <string> combs;    int idx;    void makeCombs(string s, int l, string temp ="", int start = 0){       if(temp.size() == l){          combs.push_back(temp);          return;       }       for(int i = start; i < s.size(); i++){          makeCombs(s, l, temp + s[i], i + 1);       }    }    void printVector(vector <string> v){       for(int i = 0; i < v.size(); i++){          cout << v[i] << "\n";       }       cout << endl;    }    CombinationIterator(string c, int cl) {       makeCombs(c, cl);       idx = 0;    }    string next() {       idx++;       return combs[idx - 1];    }    bool hasNext() {       return !(idx == combs.size());    } }; main(){    CombinationIterator ob("xyz", 2);    cout << (ob.next()) << endl;    cout << (ob.hasNext()) << endl;    cout << (ob.next()) << endl;    cout << (ob.hasNext()) << endl;    cout << (ob.next()) << endl;    cout << (ob.hasNext()) << endl; }

इनपुट

"xyz" और 2 से इनिशियलाइज़ करें, फिर next() और hasNext() को कई बार कॉल करें

आउटपुट

xy 1 xz 1 yz 0

  1. C++ में बाइनरी सर्च ट्री इटरेटर C++ में बाइनरी सर्च ट्री इटरेटर

    मान लीजिए हम बाइनरी ट्री के लिए एक इटरेटर बनाना चाहते हैं। दो मेथड होंगे। अगला एलिमेंट लौटाने के लिए next() मेथड, और बूलियन मान लौटाने के लिए hasNext() मेथड, जो इंगित करेगा कि अगला एलिमेंट मौजूद है या नहीं। तो यदि ट्री इस तरह है −और फंक्शन कॉल्स का अनुक्रम [next(), next(), hasNext(), next(), h

  1. - C++ में स्ट्रिंग को टोकनाइज़ करना

    इस खंड में, हम देखेंगे कि C++ में स्ट्रिंग्स को कैसे टोकनाइज़ किया जाए। C में हम कैरेक्टर सरणी के लिए strtok() फंक्शन का उपयोग कर सकते हैं। यहां हमारे पास एक स्ट्रिंग क्लास है। अब हम देखेंगे कि उस स्ट्रिंग से किसी डिलीमीटर का उपयोग करके स्ट्रिंग को कैसे काटा जाए। C++ सुविधा का उपयोग करने के लिए, हम

  1. - C++ में स्ट्रिंग को टोकनाइज़ कैसे करें?

    पहला तरीका शब्दों को स्पेस से अलग करके पढ़ने के लिए stringstream का उपयोग करना है। यह थोड़ा सीमित है लेकिन अगर आप उचित चेक प्रदान करते हैं तो यह कार्य काफी अच्छी तरह से करता है। उदाहरण #include <vector> #include <string> #include <sstream> using namespace std; int main() {