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

C++ में 2D वेक्टर फ्लैटन करें - इटरेटर डिजाइन पैटर्न


समस्या विवरण

मान लीजिए हमारे पास एक 2D वेक्टर है, हमें उस 2D वेक्टर को फ्लैट करने के लिए एक इटरेटर डिजाइन और कार्यान्वित करना है। अलग-अलग विधियां होंगी:

  • next() - वर्तमान तत्व का अगला तत्व लौटाएगा
  • hasNext() - जांचेगा कि अगला तत्व मौजूद है या नहीं

उदाहरण के लिए, यदि इनपुट [[1,2],[3],[4]] है तो यदि हम फ़ंक्शंस को इस तरह कॉल करते हैं:

  • iterator.next();
  • iterator.next();
  • iterator.next();
  • iterator.hasNext();
  • iterator.hasNext();
  • iterator.next();
  • iterator.hasNext();

तो आउटपुट [1,2,3,true, true,4,false] होगा।

समाधान दृष्टिकोण

दो पॉइंटर्स (पंक्ति और स्तंभ) का उपयोग करके 2D वेक्टर ट्रैवर्स करें:

  1. एक 2D सरणी v परिभाषित करें
  2. इनिशियलाइज़र 2D सरणी v लेता है:
    • rowPointer := 0, colPointer := 0
    • n := v का आकार
    • जब तक (rowPointer < n और colPointer >= v[rowPointer] का आकार): rowPointer++
  3. next() फ़ंक्शन:
    • x := v[rowPointer][colPointer]
    • colPointer++
    • यदि colPointer == v[rowPointer] का आकार:
      • colPointer := 0
      • rowPointer++
      • जब तक (rowPointer < n और colPointer >= v[rowPointer] का आकार): rowPointer++
    • x लौटाएं
  4. hasNext() फ़ंक्शन:
    • गलत लौटाएं जब rowPointer == n

C++ कार्यान्वयन

#include <bits/stdc++.h> 
using namespace std; 

class Vector2D { 
public: 
    int rowPointer, colPointer; 
    int n; 
    vector<vector<int> > v; 
    
    Vector2D(vector<vector<int> >& v){ 
        this->v = v; 
        rowPointer = 0; 
        colPointer = 0; 
        n = v.size(); 
        while (rowPointer < n && colPointer >= v[rowPointer].size()){ 
            rowPointer++; 
        } 
    } 
    
    int next(){ 
        int x = v[rowPointer][colPointer]; 
        colPointer++; 
        if (colPointer == v[rowPointer].size()) { 
            colPointer = 0; 
            rowPointer++; 
            while (rowPointer < n && colPointer >= v[rowPointer].size()) { 
                rowPointer++; 
            } 
        } 
        return x; 
    } 
    
    bool hasNext(){ 
        return !(rowPointer == n); 
    } 
}; 

int main(){ 
    vector<vector<int>> v = {{1,2},{3},{4}}; 
    Vector2D ob(v); 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.hasNext()) << endl; 
    cout << (ob.next()) << endl; 
    cout << (ob.hasNext()); 
    return 0;
}

इनपुट

ob.next() ob.next() ob.next() ob.hasNext() ob.next() ob.hasNext()

आउटपुट

1 2 3 1 4 0
  1. - C++ में वेक्टर को कंस्ट्रक्टर में पास करना

    यह वेक्टर को कंस्ट्रक्टर में पास करने के लिए एक सरल C++ प्रोग्राम है। एल्गोरिथम Begin    Declare a class named as vector.       Declare vec of vector type.       Declare a constructor of vector class.          Pass a vector object v a

  1. - C++ में vector::resize() और vector::reserve() का अंतर

    वेक्टर में डायनामिक ऐरे की तरह खुद को ऑटोमैटिकली रीसाइज़ करने की क्षमता होती है। जब कोई एलिमेंट डाला या हटाया जाता है, तो कंटेनर अपने स्टोरेज को ऑटोमैटिकली संभालता है। vector::resize() और vector::reserve() के बीच मुख्य अंतर यह है कि resize() वेक्टर का साइज़ बदलने के लिए उपयोग किया जाता है जबकि rese

  1. - C++ में टाइप इन्फरेंस (प्रकार निगमन)

    टाइप इन्फरेंस या डिडक्शन का अर्थ है प्रोग्रामिंग भाषा में एक एक्सप्रेशन के डेटा टाइप का ऑटोमैटिक डिटेक्शन। यह कुछ स्ट्रॉन्गली स्टैटिकली टाइप्ड भाषाओं में मौजूद एक विशेषता है। C++ में, auto कीवर्ड (C++11 में जोड़ा गया) ऑटोमैटिक टाइप डिडक्शन के लिए उपयोग किया जाता है। उदाहरण के लिए, आप एक वेक्टर पर पु