2015-01-03 4 views
7

에서 초기화 자 목록을 사용하여 함수의 매개 변수를 초기화 할 수 있습니다. 그 목적은 무엇입니까? const 벡터를 사용하여 동일한 작업을 수행 할 수 있습니까? 아래 두 프로그램의 차이점은 무엇입니까? CONST 벡터를 사용이니셜 라이저 목록 대 벡터

#include <iostream> 

using namespace std; 

int sumL(initializer_list<int> l){ 
    int sum = 0; 
    for (const auto i: l){ 
     sum += i; 
    } 
    return sum; 
} 

int main(){ 

    cout << sumL({1, 2, 3}) << "\n"; 

    return 0; 
} 

:

초기화 목록을 사용하여

#include <iostream> 
#include <vector> 

using namespace std; 

int sumV(const vector<int> l){ 
    int sum = 0; 
    for (const auto i: l){ 
     sum += i; 
    } 
    return sum; 
} 

int main(){ 

    cout << sumV({1, 2, 3}) << "\n"; 

    return 0; 
} 
+2

두 번째 코드는 필요 이상으로 필요합니다. –

+0

Offtopic : 벡터 사본을 만들었습니다 (즉, 참조를 사용하지 않았 음). for 루프에서도 마찬가지입니다. 이제는 int에 불과하지만 더 큰 객체를 사용하면 벡터의 각 객체를 복사하지 않아도됩니다. – Michiel

답변

6

std::initializer_list의 일반적인 사용은 그 용기의 편리한 초기화를 허용, 용기 (유사한) 클래스의 생성자에 인자로입니다 같은 유형의 몇 가지 객체에서. 물론 std::initializer_list을 사용하고 동일한 {} 구문을 사용할 수 있습니다.

std::initializer_list은 고정 크기이므로 동적 할당이 필요하지 않으므로 효율적으로 구현할 수 있습니다. 반면에 std::vector에는 동적 메모리 할당이 필요합니다. 간단한 예제에서도 컴파일러가이 오버 헤드를 최적화하지는 않을 것입니다 (중개자 인 std::vector 및 동적 메모리 할당을 피하십시오). 그 외에도 프로그램의 결과에는 차이가 없습니다 (복사 및 관련된 동적 메모리 할당을 피하기 위해 const std::vector<int>& 인수를 취해야 함).

3

두 가지의 의미는 매우 다릅니다. initializer_list에는 포인터 의미가 있고 vector에는 값 의미가 있습니다. 이 [dcl.init.list]/5 설명한다

int const __temp_array[3] = {1, 2, 3}; 
cout << sumL(std::initializer_list<int>(__temp_array, __temp_array + 3)) << "\n"; 

: 첫 번째 예에서

컴파일러는 다음과 같은 코드를 생성한다. 위에서 볼 수 있듯이 sumL 내에서 braced-init-list의 요소에 대한 포인터를 const에 액세스 할 수 있습니다. 이는 다른 옵션은 없지만 목록에서 요소를 복사한다는 것을 의미합니다. 필요한 경우

sumV의 경우는 vector에서 std::moved 요소를했습니다 수 (매개 변수 유형을 가정하는 것은 const하지 않습니다).

마찬가지로 initializer_list을 복사하면 얕은 복사가 수행됩니다. 즉, 포인터 만 복사되며, vector을 복사하는 것은 물론 요소가 복사됨을 의미합니다.

예에서, vector을 구성하는 것 외에 동적 메모리 할당이 필요하고 initializer_list을 구성하는 것 외에는 차이가 없습니다.

3

initializer_list은 불필요한 호출을 방지하고 불필요한 호출을 방지하며 vector에는 힙 할당이 있고 더 많은 복사본/이동이있을 수 있습니다.

1

initalizer_list는 std :: vector와 같은 일반화 된 컨테이너가 아닙니다. 오브젝트의 초기화가 주된 목적입니다. 낮은 엿 들었고 heap 할당이 매력적이라면 std :: array를 살펴 보시기 바랍니다. 기본적으로 c-array의 위에 얇은 래퍼 인 STL 컨테이너의 모든 편의성을 가진 고정 크기의 스택 할당 배열입니다.

관련 문제