2019년 11월 4일 월요일

std::vector 활용법

오늘 포스팅 할 내용은 C++ 에서 주로 쓰이는 STL (Stand Template Library) 중 vector 활용법에 대한 강좌 입니다.


현재 주로 개발하시는 분들은 모바일 개발자들이 많을거라 생각을 하니 vector 라는 이름 보다는 array 라는 용어가 더 익숙 하겠지요.


vector 는 STL 에서 제공하는 array 성 데이터를 관리의 목적으로 만들어진 Template Class 중 하나 입니다.

(c++11 에서는 array 라는 클래스를 제공 하고 있습니다.)

vector<Data type> variable; 과 같이 선언 하여 씁니다.


간단히 1부터 100까지 변수를 추가하여 값을 출력하는 코드를 만들어 보겠습니다.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <vector>

int main()
{
    std::vector<int> vecTest;

    for(int i=1; i<=100; i++)
    {
        vecTest.push_back(i);
    }

    for(int i=0; i<100; i++)
    {
        printf("vector[%d]=%d\n", i, vecTest[i]);
    }

    return 0;
}

< 위 코드는 우분투 환경에서 g++ 9.2.1 에서 빌드 되었습니다 >



코드를 보시면 알겠지만 일반적인 C언어 array 를 다루는것과 별차이는 없지만 기존 array처럼 고정 영역을 할당해서 관리하는것이 아닌 내부 저장 되는 영역을 push_back 이라는 멤버 함수의 호출로 지속적으로 추가 하는 방식으로 유동적인 메모리 핸들링을 위해서 많이 쓰이는 템플릿 클래스 입니다.



vector 관련 상세한 인터페이스는 http://www.cplusplus.com/reference/vector/vector/ 여기서 확인 하실수 있습니다.



제가 여기서 추가로 설명하고자 하는것은 제가 자주 사용하던 패턴과 사용함에 있어 필요로 생각하는 요소들만 정리해서 안내 해드리겠습니다.



a. push_back : vector 에 순차적으로 멤버를 추가 해주는 메소드 입니다. 위 샘플에서도 확인 하실수 있듯이 멤버에 대한 순차적 추가로 쓰실수 있습니다.

b. size : vector 에 저장된 멤버에 대한 갯수를 리턴해주는 메소드 입니다.

c. clear : vector 에 저장된 멤버를 모두 지우는 메소드 입니다.

d. erase : vector 에 저장된 멤버중 하나 또는 그 이상을 지우는 메소드 입니다.

e. insert : vector 에 멤버를 추가 할때 순서가 아닌 특정 위치에 추가 할수 있는 메소드 입니다.

f. begin : iterator 를 이용하는 방식을 이용할때 맨 처음에 지시하는 멤버를 리턴합니다.

g. end : iterator 를 이용하는 방식을 이용할때 맨 마지막에 지시하는 멤버를 리턴합니다.


위 설명된 항목들을 활용한 샘플 코드를 만들어 보겠습니다.


 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <vector>

int main()
{
    std::vector<int> vecTest;

    //초기 멤버 추가.
    for(int i=1; i<=100; i++)
    {
        vecTest.push_back(i);
    }

    //추가된 멤버의 갯수 출력.
    printf("vecTest Count : %d\n", (int)vecTest.size());

    //[] 연산자를 이용한 멤버 접근 방법.
    for(int i=0; i<100; i++)
    {
        printf("vector[%d]=%d\n", i, vecTest[i]);
    }

    //iterator 지시자를 이용한 멤버 접근 방법.
    std::vector<int>::iterator iteAccess;
    
    for(iteAccess = vecTest.begin(); iteAccess != vecTest.end(); iteAccess++) 
    { 
        printf("vector member = %d\n", *iteAccess);
    } 

    //20번쨰 위치에 200 엠버 추가.
    std::vector<int>::iterator iteInsert;
    iteInsert = vecTest.begin();
    for(int i=0; i<20; i++)
        iteInsert++;

    vecTest.insert(iteInsert, 200);

    printf("vector Count: %d, vecTest[20] = %d\n", (int)vecTest.size(), vecTest[20]);

    //20번째 삽입한 200 멤버 제거.
    std::vector<int>::iterator iteDelete;
    iteDelete = vecTest.begin();

    vecTest.erase(iteDelete+20);

    printf("vector Count: %d, vecTest[20] = %d\n", (int)vecTest.size(), vecTest[20]);

    //50 ~ 100 멤버 삭제.
    std::vector<int>::iterator iteRangeDel;
    iteRangeDel = vecTest.begin();

    vecTest.erase(iteRangeDel+50, iteRangeDel+100);

    printf("vector Count: %d\n", (int)vecTest.size());

    //전체 멤버 삭제.
    vecTest.clear();
    // 또는 vecTest.erase(vecTest.begin(), vecTest.end());

    printf("vector Count: %d\n", (int)vecTest.size());

    return 0;
}

vector 의 기능은 제가 링크를 걸은 곳에서 더 많은 기능을 확인 하실수 있습니다.

vector 는 기본적으로 선형 저장 클래스 입니다. 기능적으로 중간 삭제나 삽입 기능이 존재 하지만 성능상으로는 크게 좋지는 않기 때문에 순차적인 저장과 접근을 쓰는데 쓰시는게 더욱 용이합니다.

댓글 없음: