예제코드
#include <iostream>
#include <array>
using namespace std;
using namespace std::tr1;
void main()
{
array<int, 100> intarr;
//초기화
intarr.assign(0); //모든 요소를 0으로 초기화한다
for (int i = 0; i < 100; ++i)
{
cout << intarr[i] << " ";
}
//값을 대입해본다
for (int i = 0; i < 100; ++i)
{
intarr[i] = i;
}
cout << endl << "Size : " << intarr.size() << endl;
cout << "이터레이터를 사용한 루프" << endl;
array<int, 100>::iterator ia;
for (ia = intarr.begin() ; ia != intarr.end(); ++ia)
{
//이터레이터를 사용한 루프
cout << *ia << " ";
}
cout << endl << "일반 배열처럼 접근하는 루프" << endl;
for (int i = 0; i < 100; ++i)
{
cout << intarr[i] << " ";
}
//만약 범위를 벗어난다면 std::range_error 예외를 생성한다
// intarr[100] = 1;
system("pause");
}
TR1에서 추가된 array는 크기가 고정된 배열입니다.
즉 위에서의 array<int, 100> intarr 은 int intarr[100] 과 본질적으론 차이가 없습니다.
단지 관리를 편리하게 하기 위해 객체로 제공된다는것(C#, Java 와 같다고 보심 편합니다) 그리고 범위를 넘어설 시 예외를 발생한다는점이 특징입니다. (C의 배열은 범위를 넘어서도 치명적인 부분에 접근하기전까지는 오류발생을 모르는 경우도 있고.. 이경우 오류의 추적이 매우 어렵습니다)
C++ 표준 라이브러리의 일부가 될 TR1이므로 STL에서 사용하는 이터레이터 문법을 그대로 사용 할 수 있으며,
일반 배열과 본질적으로 같으므로 [] 연산자로 값을 읽고 쓸 수도 있습니다.
또한 swap, assign, size 등의 멤버함수를 제공하여, 초기화, 교체 등의 작업을 쉽게 할 수 있으며, 배열의 크기를 얻어 올 수도 있습니다.
배열에 비해 사용시의 오버헤드가 좀 있긴 하지만... 안정적인 프로그램의 메모리 관리를 위해서는 사용 해 볼만 합니다.
|