C/C++에서 뒤에서부터 loop를 도는 제일 좋은 방법

배열을 뒤에서 앞으로 접근할 건데요, 제가 짠 소스코드 말고 더 좋은 방법을 알고 싶어요

소스코드

for (int i = myArray.Length - 1; i >= 0; i--)
{
    //뭔가를 처리
    myArray[i] = 0;
}

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    일반적으로는

    for (int i = myArray.Length; i --> 0; )
    {
        //do something
    }
    

    같이 씁니다.

    그 외에도 세세하게 나누면 C++에서는 배열과 std::vector에 접근할 때 서로 다른 방법을 써야 합니다.

    std::vector에 접근할 때

    1. iterator로 접근 : std::reverse_iterator사용

    for(std::vector<T>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it) {
        /* std::cout << *it; ... */
    }
    

    2. 인덱스로 접근

    인덱스의 타입이 size_t가 아닌걸 주목해주세요. someVector.size()size_t가 아니라 size_type 타입의 값을 return 하기 때문에 이렇게 써야 합니다

    for(std::vector<int>::size_type i = someVector.size() - 1; i != (std::vector<int>::size_type) -1; i--) {
        /* std::cout << someVector[i]; ... */
    }
    

    배열에 접근할 때

    1. iterator로 접근 : std::reverse_iterator 사용

    for(std::reverse_iterator<element_type*> it(a + sizeof a / sizeof *a), itb(a); it != itb; ++it) {
        /* std::cout << *it; .... */
    }
    

    2. 인덱스로 접근

    sizeof는 항상 std::size_t 타입의 값을 return 하기 때문에 여기서는 std::size_t를 쓸 수 있습니다.

    for(std::size_t i = (sizeof a / sizeof *a) - 1; i != (std::size_t) -1; i--) {
       /* std::cout << a[i]; ... */
    }
    

    근데 위의 방법은 a가 배열이 아니라 pointer일 때도 컴파일이 되기 때문에 주의해서 써야 합니다.

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.