Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 조합을 위한 반복자


몇 가지 작업으로 구성된 Iterator 클래스를 설계해야 한다고 가정해 보겠습니다. -

  • 정렬된 고유한 영문 소문자의 문자열 문자와 숫자 조합 길이를 매개변수로 사용하는 생성자를 정의합니다.
  • 길이 조합 길이의 다음 조합을 알파벳 순서로 반환하는 함수 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를 삽입하고 반환
  • 범위 시작에서 s
      까지의 i에 대해
    • makeCombs(s, l, temp + s[i], i + 1)
  • printVector() 메서드는 문자열 배열을 입력으로 사용하며, 해당 배열의 요소를 표시합니다.
  • 다음과 같이 생성자를 정의합니다. 이것은 문자열 c와 cl을 사용합니다.
  • makeCombs(c, cl) 호출, idx :=0으로 설정
  • next() 메소드는 idx를 증가시키고 빗[idx - 1]을 반환합니다.
  • hasNext() 메서드는 idx가 빗의 크기와 같지 않으면 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