아래의 소스는 (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
//
// 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]
'프로그래밍 > C++' 카테고리의 다른 글
C++98 에서와 C++11 에서의 swap 함수 사용법 비교 (0) | 2013.09.30 |
---|---|
c++0x 의 vector 타입과 for 반복문에 관하여 (0) | 2013.09.27 |
vector 타입을 이용한 간단한 행렬 곱셈을 수행하고 행렬식을 구하는 C++ 언어 소스 (0) | 2013.09.20 |
우순열 기순열을 이용하여 정사각행렬의 행렬식을 계산하는 C++ 언어 소스 (0) | 2013.09.20 |
지정한 개수의 모든 순열을 출력하는 C++ 언어 소스 (0) | 2013.09.20 |