Search
Duplicate

C++11 auto

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C++
Scrap
태그
키워드
auto
9 more properties
백준 알고리즘 2293번을 풀다가 정리하게 되었다.

C++11 auto

C++11이후 auto 키워드에 대한 개편이 있었기 때문에 이전 auto에 대해서는 공부할 필요가 없다.
microsoft의 공식 c++ documents에서는 auto를 다음과 같이 정의하고 있다.
Deduces the type of a declared variable from its initialization expression.
즉, auto 키워드는 선언 된 변수 또는 람다식 매개 변수의 초기화 식을 사용 하여 해당 형식을 추론 하도록 컴파일러에 지시를 한다.

Syntax

auto declarator initializer; [](auto param1 , auto param2 ) {};
C++
복사

Remarks

ms docs에서는 아래와 같은 이유들로 auto키워드의 사용을 추천한다.
Robustness
식의 형식이 변경 된 경우에만 작동
Performance
변환이 발생하지 않을 것으로 보장
Usability
형식 이름 문제 및 오타 걱정 없음
Efficiency
효율적인 코딩 수행 가능
하지만 특정 형식의 반환을 원하는 경우에는 사용을 권하지 않는다.
auto 키워드는 자체 형식이 아니기 떄문에 sizeof 와 같은 연산자에서는 사용할 수 없다.
auto 키워드는 함수의 매개변수로는 사용할 수 없다! (해당 객체 자료형 크기를 모르기 때문)

auto 초기화 구문

auto 키워드는 다양한 방식을 사용해서 초기화할 수 있다.
// 범용 초기화 구문 auto a {42}; // 할당 구문 auto a = 42; // 범용 할당 구문 auto a = {42.42}; // 직접 초기화 구문(생성자 스타일) auto a(42.42);
C++
복사
만약 auto선언만 하고 초기화를 하지 않으면 해당 변수는 사용이 불가능하다! auto는 초기화된 값을 기준으로 자료형을 선택하기 때문이다.

사용 예시

1. for-each

auto 키워드는 루프문에서도 사용할 수 있다. 아래는 일반적인 for-each 구문이다
for(int i : iterable)
C++
복사
auto 키워드를 활용한 for-each 구문은 아래와 같다.
for(auto& i : iterable)
C++
복사
위의 auto키워드에 &를 붙인 이유는 주소를 참조하기 위함이다. auto i : iterable 과 같은 형식으로 작성하면 해당 iterable 값이 i에 복사가 되어 들어가기 때문에 i 를 아무리 수정하더라도 iterable 내부의 값이 변경되지 않는다. 따라서 iterable 내부의 값을 조정해야 하는 경우에는 위와 같은 형태로 작성해주면 된다.
아래 코드는 auto 키워드를 활용한 루프로 vector 의 값을 input, output 해보는 예시이다.
// auto 키워드로 vector 원소 input for (auto &i : ip) std::cin >> i; // auto 키워드로 vector 원소 output 값이 복사가 되기 때문에 좋은 방식은 아니다. for (auto i : ip) std::cout << i << " "; // auto 키워드로 iterator를 받을 수 있다. deque<double> dqDoubleData(10, 0.1); // auto 키워드로 받는경우 for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter) // auto 키워드 없이 그대로 받는경우. for (deque<double>::iterator iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
C++
복사

2. 긴 자료형을 간단하게

다양한 자료구조를 활용해서 변수의 타입이 엄청나게 길어지는 경우 auto키워드를 사용해 간단하게 표현할 수 있다. 아래는 map m의 iterator i를 auto 키워드로 받는 경우이다.
map<int,list<string>>::iterator i = m.begin(); auto i = m.begin();
C++
복사

3. 함수를 위한 타입추론

c++ 14에서 auto 키워드가 함수의 반환 타입을 자동으로 추론할 수 있도록 확장되었다.
auto add(int x, int y) { return x + y; }
C++
복사

Reference