nested for 구현 중 질문

  • nocut98
    nocut98

    [code]
    FOR(i,0,10) FOR(j=i+1, 0, 5) {
    }
    [/code]
    이런 식으로 for문이 여러번 유동적으로 붙을 수 있는 경우에 쓸 nested loop 함수를 만들려고 했습니다.
    요딴 식은 쉽죠.
    [code c++]
    vector > val; // 시작과 끝값을 pair로 만들어서 넣어줍니다.
    val.push_back(mp(0, 10)); // i를 val[0].first j를 val[1].first에 넣어서 푸는 거죠
    val.push_back(mp(0, 5));
    nested_for(val);
    [/code]
    문제는!! " j = i+1 " 처럼 내부의 iterator를 참조하는 부분입니다.
    val[1].first = val[0].first + 1;
    이렇게 했다간 그때의 값만 들어갈 뿐 입니다.
    물론 포인터를 이용해서 그때의 값을 받아올 순 있지만 그러면 코드가 복잡해 집니다
    (게다가 j = i*i + 1) 등의 복잡한 수식을 하드 코딩해야 하구요)
    결국 직관적인 방법은
    "val[0].first + 1", "0", "1"
    이 문자열을 저장해서 동적으로 그때 그때 실행해서 0,1,2,3,4.. 로 바뀌는 val[0].first값을 반영하는 건데요.
    (구현만 하려고 하면, 함수객체등을 이용하면 가능할 수도 있습니다만... 그러면 사용하기 너무 불편할 듯 합니다)
    결국 방법은 함수객체 밖에 없을까요??

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    16년 전
2개의 댓글이 있습니다.
  • ipknHama
    ipknHama

    nested_for를 통해서 for문 두개를 하나로 표현해서 어떤 점을 얻으려고 하신거에요?
    정확히 원하는 부분이 뭔지 잘 모르겠네요.


    16년 전 link
  • nocut98
    nocut98

    for문이 동적으로 겹쳐서 필요할 때가 있거든요. 보통은 recursive function을 짜서 돌리는데, 동적으로 처리해 볼려구요.
    예를 들어서 ABC가 표현 가능한 수를 출력하라면 FOR(i,0,10) FOR(j,0,10) FOR(k,0,10) {cout << i*100+j*10+k; }
    이런 식으로 코딩할 수 있는데, ABCDE도 들어올 수 있고, 뭐 동적으로 갯수가 변한다고 하면, FOR문의 숫자를 동적으로 조절해야 하죠(지금 문제야 10진수와 자리수를 세서 FOR문 하나로도 되지만 그렇게 짜지 못한다고 하면요)
    이럴 때 recursive 하게 생각을 해서 짤 수 있지만, 제 느낌은 그렇게 하면 뭔가 생각한대로 짜는 게 아니라 생각의 "변형"을 해야 하는 경우가 생기기 때문에 위의 경우에는 내부에 들어갈 함수 객체와 {{0,10},{0,10},{0,10}} 정도의 배열을 넘겨주고 싶은 거죠.
    문제는 실제로 배열만 필요한 게 아니라 경우에 따라서 {0,10}, {i+1, 10}, {j+1, 10}} 정도의 내용이 필요합니다. 단순히 배열을 복사해서 넘기게 되면, i나 j에 따라 iterator의 값이 동적으로 변하는 경우에는 대응을 못하죠. 단순히 구현만 하는 건 가능하겠지만 그러다보면 인터페이스가 복잡해서져서 사용이 힘들죠.
    그래서 생각한 건 함수객체를 이용해서 {Zero(), Num(10)}, {Plus(1), Num(10)}, {Plus(1), Num(10)}
    이런 식으로 구현할 수도 있겠지만, 역시 알아보기 힘듭니다. 그리고 j = i*i+1 이나 j = get(i) 등등의 수식을 처리하려면 다 처리해 주든가 코드가 복잡해지죠 ㅡ.ㅡ;; 그래서 가급적... {"0", "10"}, {"i+1", "10"}, {"j+1", "10"} 요런 식으로 구현해보고 싶었던 거구요.
    지금 드는 생각은 그냥 이터레이터에 대한 규칙 함수를 만들어서 넣어주는 게 낫겠다는 생각이 드네요.


    16년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.