C ++
 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]

になります。

これを解決するには、次の手順に従います-

  • 1つの2Dアレイvを定義する

  • イニシャライザーを定義します。これには1つの2D配列vが必要です。

  • rowPointer:=0

  • colPointer:=0

  • n:=vのサイズ

  • while(rowPointer =size of v [rowPointer])、do-

    • (rowPointerを1増やします)

  • 関数next()を定義する

  • x:=v [rowPointer、colPointer]

  • (colPointerを1増やします)

  • colPointerがv[rowPointer]のサイズと同じである場合、-

    • colPointer:=0

    • (rowPointerを1増やします)

    • while(rowPointer =size of v [rowPointer])、do-

      • (rowPointerを1増やします)

  • xを返す

  • 関数hasNext()

    を定義します
  • rowPointerがn

    と同じ場合はfalseを返します

理解を深めるために、次の実装を見てみましょう-

#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(){
      //cout << rowPointer << " " << colPointer << endl;
      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);
   }
};
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());
}

入力

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

出力

1
2
3
1
4
0

  1. C++でのvector::resize()とvector ::reserved()

    ベクトルには、要素が挿入または削除されたときに動的配列のように自動的にサイズを変更する機能があり、コンテナはストレージを自動的に処理します。 vector resize()とvector reserved()の主な違いは、resize()がベクトルのサイズを変更するために使用されることです。reserve()は使用されません。reserve()は、少なくとも指定された要素の数を格納するためにのみ使用されます。メモリを再割り当てする必要はありません。ただし、resize()では、数値が現在の数値よりも小さい場合、メモリのサイズが変更され、その上の余分なスペースが削除されます。 vector

  2. C++での型推論

    型推論または推論とは、プログラミング言語での式のデータ型の自動検出を指します。これは、いくつかの強く静的に型付けされた言語に存在する機能です。 C ++では、autoキーワード(C ++ 11で追加)が自動型推定に使用されます。たとえば、ベクトルを反復処理するイテレータを作成する場合、その目的でautoを使用するだけです。 例 #include<iostream> #include<vector> using namespace std; int main() {    vector<int> arr(10);