C++11 std::array 정적 배열 대체


C++11 std::array 정적 배열 대체


우리가 보통 배열을 선언을 하면

int arr[] = {1,2,3,4,5} 이렇게 선언을 한다.

이렇게 선언할시에 우리가 [] 괄호 안에 num을 안써줘도 컴파일러 알아서 메모리를 잡아준 다는 것이다.


우리가 이번에 할 것은 C++11에서 std::array 라는 것이다.

std::array를 쓸 경우 더 편하고 안정성 있게 사용할 수 있다.


코드를 보면서 이해해 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <array>
using namespace std;
 
void printLength(array<int5> &my_arr)
{
    cout << my_arr.size() << endl;
}
 
int main()
{
    array<int5> my_arr = { 1,2,3,4,5 };
    cout << my_arr[0<< ' ' << my_arr[1<< endl;
 
    my_arr = { 7,8, };
    cout << my_arr[2<< ' ' << my_arr[3<< endl;
 
    cout << my_arr.size() << endl;
    printLength(my_arr);
 
    cout << my_arr[10<< endl;
    cout << my_arr.at(10<< endl;
 
    return 0;
}
cs


2행에서 보면 array 헤더파일을 include 해주고 있다.
std::array를 쓰려면 array 헤더파일을 꼭 include 해줘야 한다.

12행에서 int형 5개 배열을 선언해주고 있다.
array<"데이터형", "갯수"> 이름;      이렇게 선언해주면 된다.

13행에서 우리가 배열을 쓰듯이 정상적으로 출력이 되고
15행에서 다시 2개의 원소만 초기화를 하면 나머지 2,3,4 번째 데이터에는 자동으로 0 으로 채워지게 된다.
여기까지는 우리가 쓰는 배열과 똑같다.

그럼 std::array의 장점은 뭘까??

18행에서 my_arr.size() 를 실행하게 되면 배열의 원소가 몇 개 인지 출력을 해준다.
19행에서 함수 매개변수로 넘겨줄 때 그냥 넘겨주면 복사가 되기 때문에, 만약 배열이 20000개의 배열을 넘겨준다고 예를 들으면
20000개의 배열이 모두 복사가 될 것이다. 너무 비 효율적이니 5행에서 래퍼런스 변수를 사용해서 넘겨주도록 하자.

21행에서 my_arr[10] 을 출력하게 되면 10번째 원소가 있는지 없는지 확인도 안하고 그냥 출력을 해준다.
22행을 보면 my_arr.at(10)을 하면 유효성 검사를 거치고 10번째 원소가 있는지 없는지 확인을 하고 출력을 해준다.
만약 10번째 원소가 없다면 예외처리를 해준다.

퍼포먼스쪽 중심을 둔다면 15행처럼 하면 되고 퍼포먼스 상관이 없다면 16행을 하면 된다.
16행은 예외처리를 하기에 속도가 더 느리다는 단점이 있다.

더 편한것을 보자.




순서가 뒤죽박죽 있는 배열을 정렬을 한다고 해보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <array>
#include <algorithm> //std::sort
using namespace std;
 
int main()
{
    array<int5> my_arr = { 1,21,13,42,5 };
    
    std::sort(my_arr.begin(), my_arr.end());
 
    for (auto &n : my_arr)
        cout << n << ' ';
    cout << endl;
 
    return 0;
}
cs


< 출력 결과 >


8행에서 초기화를 시킬 때 아무렇게 데이터를 넣어줬다.

10행에서 정렬을 하는데 my_arr의 처음과 끝 번호까지 자동으로 넣어준다.


만약 일반 배열이라면 우리가 처음과 끝 번호를 일일이 넣어줘야 한다.

std::array 배열을 사용을 하면 begin과 end만 넣어주면 자동으로 처음과 끝을 넣어주게 된다.


만약 역순으로 정렬하고 싶으면은 rbegin, rend를 넣어주면 된다.


정말 편하지 않은가??






댓글

Designed by JB FACTORY