C++ auto를 활용한 for문 사용법

조회수 15390회
int * buff = new int[10];

for(auto x : buff?? )
{
    x = 0;
}

동적할당 받은 buff를 전부 0으로 초기화 하고 싶은데, buff??를 어떻게 적어야 할지 알려주세요.. buff[] , buff 등 여러개 써봤는데 더 에러가 뜨네요 ㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 범위 기반 for 문 에서 원소를 가져오는 대상이 되는 객체는 배열이거나 멤버 함수로 begin()end() 를 갖거나 해당 객체에 대한 자유 함수 begin()end() 가 존재 해야합니다.

    int* buff 는 배열이 아니기 때문에 범위 기반 for 문을 사용할 수 없습니다. 따라서 포인터가 아닌 다른 방법을 이용해야 합니다.

    첫 번째로 STL 컨테이너 중 하나인 std::vector 를 사용하는 방법이 있습니다. std::vector 는 배열과 같이 연속된 메모리 공간에 원소를 저장하게 되며, 메모리 공간 또한 동적 메모리에 생성하게 됩니다. 사용방법 또한 배열과 유사하며 배열보다 편리한 기능들이 포함되어 있습니다.

    #include <iostream>
    #include <vector>
    
    int main() {
        std::vector<int> buff(10); // 원소를 10개 생성
        for (auto x : buff)
            std::cout << x << std::endl;
        return 0;
    }
    

    두 번째로 포인터를 배열로 강제 변환하는 방법이 있습니다. 이 방법은 배열의 크기를 잘못 지정할 경우 프로그램에 심각한 문제를 발생키기 때문에 사용을 권장하지 않습니다.

    #include <iostream>
    
    int main() {
        typedef int Array[10];
        int* buff = new Array;
        for (auto x : reinterpret_cast<Array&>(buff))
            std::cout << x << std::endl;
        return 0;
    }
    
  • 다른분이 멋진 대답을 해주셨지만 배열을 초기화 하고 싶을 때 한가지가 더 필요합니다.

    for(int x: buff)
        x=0;
    

    다음 코드에서는 buff배열이 0으로 초기화 되지 않습니다. 이유는 x는 함수에서 사용하듯이 한가지의 독립 변수고 한번 돌때마다 그 값이 buff의 값과 같은 것 뿐입니다.

    그러면 우리는 참조를 통해 그 값을 정확히 가리키게 해야 합니다.

    for(int& x: buff)
        x=0;
    

    다음과 같이 코드를 작성하면 각각의 값을 0으로 초기화 할 수 있습니다.

    하지만 초기화가 목적이라면 std::vector의 생성자를 이용하는것이 더욱 간편합니다.

    vector<int> buff(n, k); //n: 배열의 크기, k: 초기화 하고 싶은 값
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)