아래의 소스는 (64 비트) 윈도우 8 에서 Visual Studio 2013 Express 의 명령줄 컴파일러 cl 및 cygwin64 의 컴파일러 g++ 로 테스트되었다. (소스를 저장할 시, Visual C++ 용으로는 KSC5601-1987 인코딩으로 저장하고, cygwin64 의 g++ 용으로는 UTF-8 인코딩으로 저장해야 한글이 정상 출력된다.)

 

vector 타입을 초기화(initializer lists)하는 구문

    vecor<T> v { .... }

또는

   vector<T> v = { ... }

은 C++0x(정확하게는 C++09 이후) 또는 C++11 에서만 지원되는 구문이다.

그러므로 다음 소스는 Visual Studio 2010 이나 g++ 의 버전이 4.4 미만이면 컴파일되지 않는다. Visual Studio 2012 도 최소한 November 2012 CTP 이후라야 컴퍼일된다.
 

        [참고 1] Vector initialization with more values in c++11

        [참고 2] Initializer list not working with vector in Visual Studio 2012?

        [참고 3] C++0x Core Language Features In VC10: The Table

        [참고 4] C++11 Features in Visual C++ 11

        [참고 5] C++0x initialization: Lists

 

// Filename: initializeVector_02.cpp
//
// Compile: cl /EHsc initializeVector_02.cpp
// Execute: initializeVector_02
//
//      or
//
// Compile: g++ -std=c++11  -o initializeVector_02 initializeVector_02.cpp
// Execute: ./initializeVector_02
//
// Date: 2013. 9. 25.

#include <iostream>
#include <vector>
#include <cmath>

template <typename T>
void printVector(std::vector<T> v)
{
    std::cout << "[";
    for (auto it = std::begin(v); it != std::end(v); it++)
    {
        std::cout << *it;
        if ((it + 1) != std::end(v))
            std::cout << ", ";
    }
    std::cout << "]";
    std::cout << std::endl;
}

int main()
{
    std::cout << "Hello, 안녕하세요?" << std::endl;

    std::vector<double> v1 = { 1, 2, 3, 4, 5 };
    std::cout << "v1 = ";
    printVector(v1);

    std::cout << "v2 = ";
    std::vector<double> v2 = { sin(v1[0]), cos(v1[1]), exp(v1[2]), log(v1[3]), pow(2, v1[4]) };
    printVector(v2);

    return 0;
}

/*
Output:
Hello, 안녕하세요?
v1 = [1, 2, 3, 4, 5]
v2 = [0.841471, -0.416147, 20.0855, 1.38629, 32]
*/

 

* Visual Studio 2012 Express for Windows 8 의 컴파일러 cl 을 사용하여 위의 소스를 컴파일한 경우의 컴파일 에러 메세지

Prompt> cl /EHsc initializeVector_02.cpp
x86용 Microsoft (R) C/C++ 최적화 컴파일러 버전 17.00.50727.1
Copyright (c) Microsoft Corporation. All rights reserved.

initializeVector_02.cpp
initializeVector_02.cpp(34) : error C2552: 'v1' : 이니셜라이저 목록을 사용하여
비집합체를 초기화할 수 없습니다.
        'std::vector<_Ty>' : 기본이 있는 형식은 집합체가 아닙니다.
        with
        [
            _Ty=double
        ]
initializeVector_02.cpp(39) : error C2552: 'v2' : 이니셜라이저 목록을 사용하여
비집합체를 초기화할 수 없습니다.
        'std::vector<_Ty>' : 기본이 있는 형식은 집합체가 아닙니다.
        with
        [
            _Ty=double
        ]

 

* cygwin64 의 (버전 4.8.1 인) 컴파일러 g++ 로 옵션 -std=c++0x 또는 -std=c++11 을 주어 위의 소스를 성공적으로 컴파일하고 실행한 경우

g++ -std=c++0x  -o initializeVector_02 initializeVector_02.cpp

$ ./initializeVector_02
Hello, 안녕하세요?
v1 = [1, 2, 3, 4, 5]
v2 = [0.841471, -0.416147, 20.0855, 1.38629, 32]

g++ -std=c++11  -o initializeVector_02 initializeVector_02.cpp

$ ./initializeVector_02
Hello, 안녕하세요?
v1 = [1, 2, 3, 4, 5]
v2 = [0.841471, -0.416147, 20.0855, 1.38629, 32]

 

Posted by Scripter
,