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

सी ++ में संयोजन के लिए इटरेटर


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

  • एक ऐसे कंस्ट्रक्टर को परिभाषित करें जो सॉर्ट किए गए अलग-अलग लोअरकेस अंग्रेज़ी अक्षरों के स्ट्रिंग वर्ण और पैरामीटर के रूप में एक संख्या संयोजनLength लेता है।
  • अगले फ़ंक्शन को परिभाषित करें() जो लंबाई संयोजन के अगले संयोजन को वर्णानुक्रम में लंबाई देता है।
  • किसी अन्य फ़ंक्शन को परिभाषित करें hasNext() जो कि सही है और केवल तभी लौटाता है जब कोई अगला संयोजन मौजूद हो।

तो अगर इनपुट की तरह है -

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

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

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

उदाहरण(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;
}

इनपुट

Initialize with “xyz” and 2, then call next() and hasNext() multiple times

आउटपुट

xy
1
xz
1
yz
0

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

    मान लीजिए हम बाइनरी ट्री के लिए एक इटरेटर बनाना चाहते हैं। दो तरीके होंगे। अगला () विधि अगले तत्व को वापस करने के लिए है, और hasNext () विधि बूलियन मान वापस करने के लिए है, जो इंगित करेगा कि अगला तत्व मौजूद है या नहीं। तो अगर पेड़ जैसा है - और फ़ंक्शन कॉल का क्रम [अगला (), अगला (), है नेक्स्ट (),

  1. सी ++ में एक स्ट्रिंग को टोकन करना

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

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

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