C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での組み合わせのためのイテレータ


いくつかの操作で構成されるイテレータクラスを設計する必要があるとします-

  • ソートされた個別の小文字の英字の文字列文字と数値combinationLengthをパラメーターとして受け取るコンストラクターを定義します。
  • 長さcombinationLengthの次の組み合わせをアルファベット順に返す関数next()を定義します。
  • 次の組み合わせが存在する場合にのみTrueを返す別の関数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

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

  • 文字列の配列コームを作成し、idxにインデックスを付けます
  • メソッドmakeCombs()を定義します。これは、文字列s、整数変数l、最初は空の一時文字列、および最初は0の開始を取ります。これは次のように定義されます-
  • tempのサイズ=lの場合、tempをコームに挿入して返します
  • 範囲内のiの場合はsのサイズから開始します
    • makeCombs(s、l、temp + s [i]、i + 1)
  • printVector()メソッドは、文字列の配列を入力として受け取ります。これにより、その配列の要素が表示されます
  • コンストラクターを次のように定義します。これには文字列cとclが必要です。
  • makeCombs(c、cl)を呼び出し、idx:=0を設定します
  • next()メソッドはidxを増やし、comb[idx-1]を返します
  • hasNext()メソッドは、idxがcombのサイズと同じでない場合はtrueを返し、そうでない場合は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;
}

入力

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

出力

xy
1
xz
1
yz
0

  1. C++の二分探索木イテレータ

    二分木用に1つのイテレータを作成するとします。 2つの方法があります。 next()メソッドは次の要素を返し、hasNext()メソッドはブール値を返します。これは次の要素が存在するかどうかを示します。したがって、ツリーが次のような場合- そして、関数呼び出しのシーケンスは、[next()、next()、hasNext()、next()、hasNext()、next()、hasNext()、next()、hasNext()]です。出力は[3,7、true、9、true、15、true、20、false]になります これを解決するには、次の手順に従います- nextとhasNextの

  2. C ++で文字列をトークン化しますか?

    最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() {    string str("Hello from the dark side");    string tmp; // A string