C++ auto를 활용한 for문 사용법
조회수 15400회
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: 초기화 하고 싶은 값
댓글 입력