কম্পিউটার টিউটোরিয়াল

C++-এ Flatten 2D Vector: ২D ভেক্টরকে ফ্ল্যাটেন করে ইটারেটর বানানো

একটি ২D ভেক্টর দেওয়া আছে। এটিকে ফ্ল্যাটেন (Flatten) করে একটি ইটারেটর ইমপ্লিমেন্ট করতে হবে যাতে সিকোয়েনশিয়ালি সব এলিমেন্ট এক্সেস করা যায়। দুটি মেথড থাকবে:

  • next() - বর্তমান এলিমেন্টের পরের এলিমেন্ট রিটার্ন করবে।
  • hasNext() - পরবর্তী এলিমেন্ট আছে কিনা চেক করবে।

উদাহরণ

ইনপুট: [[1,2],[3],[4]]

ফাংশন কল সিকোয়েন্স: next() → 1, next() → 2, next() → 3, hasNext() → true, hasNext() → true, next() → 4, hasNext() → false

আউটপুট সিকোয়েন্স: [1,2,3,true,true,4,false]

সমাধানের পদ্ধতি (Two Pointers: Row & Column)

  1. ২D ভেক্টর v, রো পয়েন্টার rowPointer, কলাম পয়েন্টার colPointer, মোট রো n।
  2. কন্সট্রাক্টরে: rowPointer = 0, colPointer = 0। খালি সারি স্কিপ করুন (while লুপ)।
  3. next():
    • x = v[rowPointer][colPointer]।
    • colPointer++।
    • যদি colPointer == v[rowPointer].size() (সারি শেষ), তবে:
      • colPointer = 0, rowPointer++।
      • খালি সারি স্কিপ করুন (while লুপ)।
    • x রিটার্ন করুন।
  4. hasNext(): rowPointer != n হলে true, অন্যথায় false।

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;   // 1
    cout << (ob.next()) << endl;   // 2
    cout << (ob.next()) << endl;   // 3
    cout << (ob.hasNext()) << endl; // 1 (true)
    cout << (ob.next()) << endl;   // 4
    cout << (ob.hasNext());        // 0 (false)
    return 0;
}

ইনপুট

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

আউটপুট

1 2 3 1 4 0
  1. C++-এ ভেক্টর সর্ট করা (Sorting a vector in C++)

  2. C++-এ কনস্ট্রাক্টরে ভেক্টর পাস করা (Passing a vector to constructor in C++)

  3. C++-এ vector::resize() বনাম vector::reserve() পার্থক্য

  4. C++-এ টাইপ ইনফারেন্স (Type Inference)