ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Vector 사용법 C++ STL
    카테고리 없음 2021. 10. 17. 19:33

    C++ STL인데 C를 다루어 C++에 입문한 사람이라면 STL의 편리함에 감탄하는 사람도 있지만 그렇지 않은 사람도 있다. 필자는 예전에는 생소해 어떻게 쓰는지도 몰랐는데 써보고 감탄만 할 뿐이다. 따라서 이 Vector를 어떻게 사용하는지 간단히 말하겠다.

    선언 # include < vector >

    벡터 간략 구조

    대충 이런 구조다.

    예를 들어 이해해 보자.

     

    STL vector는 마치 Linked List와 같이 삽입 및 삭제가 가능함에도 불구하고 배열과 같이 데이터를 운용할 수 있다는 장점이 있다.

    그리고 STL을 사용하는 가장 큰 이유는 저렇게 위와 같이 데이터를 관리할 때 임의의 데이터 타입으로 바로 우리가 잘 알고 있는 데이터 구조를 만들어 굴릴 수 있기 때문이다.

    1.선언, 데이터 insert 벡터의 선언은 이하와 같다.vector < type 이름 > variableName ;

    지금은 단순히 int로 했지만 나중에 전화번호부를 만들거나 하면 사람에 대한 class의 정보를 가지고 자료구조로 만들어 써야 할 필요가 느껴질 때가 온다. 그럴 때 쓰면 정말 유용해져.

    push_back() 함수를 함수를 통해 vector 타입에 맞는 데이터를 가져올 수 있다.

    2.벡터 for로 돌리는 Vector iteration이라는 멋진 말이 있다. 하지만 말이 중요한 게 아니라 결국 vector 전체를 한번 보고 싶을 때 어떻게 하느냐가 중요하다" 배열처럼 생각하면 다음과 같이 조립할 수 있다.

    벡터의 크기를 나타내는 size()로 총 개수를 받고 그만큼 index를 0부터 해당하는 크기만큼 돌게 된다. 이 방법의 장점은 기존의 배열과 for 문도가 거의 유사해 vector의 사용에 거리감이 없어진다. 그러나 vector로 쓰는 것이 아니라 배열처럼 쓰는 것이기 때문에 다른 vector의 좋은 기능들과는 호환되지 않는다는 것이 단점이다.

    다음 for문을 보자.갑자기 iterator가 나와서 거부감을 느낄 것이다. iterate는 배열이나 for로 한 바퀴 도는 것이고, iterator는 그것을 하는 것이다.

    for 문의 초기식을 다음과 같이 설정한다.vector <int> :: iterator it = intVector.begin() 여기에서 가장 위의 간단한 구조를 알아보자.

    begin이 맨 앞 자료를 가리킨다 그리고 *it을 통해 참조하여 해당 데이터를 얻는다.

    배열로 보면

    int arr [ 4 ] = { 0 , 1 , 2 , 3 } ;

    arr[0]의 주소, 즉 &arr[0]에 해당하는 것.간단히 말해서 배열의 맨 앞 주소로 이해하기 쉽다.

    intVector.begin() 이것으로 해당 주소를 vector <int> :: iterator 타입의 변수 it에 넣어준다는 것이다.it는 변수의 이름이니 다른 원하는 것을 넣어도 된다.

    for 세 번째 부분에 소위 증감식이라고 불리는 부분이 비어있습니다. 그리고 본문에 it++로 다음의 포인터를 나타내는 것을 볼 수 있다. 본래 it++를 증감식 부분에 넣어도 무방하나, 후술하는 erase() 함수를 위해 이하 본문에서 삭제했다. 따라서 특별한 경우가 없다면 그대로 본문에서 it+하는 것이 좋다.

     

    3. For 문도는 중간에 하나 지우고 계속 돈다 for 문도하는 이유는 다양하지만 돌아가면서 원하는 것을 지우고 싶을 때도 있다 이 경우 배열은 해당 데이터를 삭제하고 나머지 데이터를 일일이 체크하는 작업을 해야 하지만 Vector는 그럴 필요가 없다. 이하의 예를 살펴보자.1번의 경우 0부터 6까지 값을 int Vector에 넣어놓았다. 그래서 지금은 01 23 456이라는 값이 쌓여 있다. 이 중에서 만약에 4라는 값이 발견되면 그걸 끄고 012 33 56으로 하고 싶으면 어떻게 해야 할까? 라고 하는 질문에 대해서, 대답은 「erase 를 사용하십시오」라고 하는 대답이다.

    *it가 4인 경우가 왔다 조건문이 만족하고 erase 함수가 실행된다.

    그러면 결과치는 무엇이 되는 것일까? 현재 it는 vector로부터 4라는 데이터를 가리키고 있다. 그러나 erase 함수가 실행되면 해당 4는 사라지고 it는 다음 값을 가리키게 된다. 즉, 이 예에서는 5를 가리키게 된다.0 1 2 3 4 5 6x x x x ↑ x x 에서 0 1 2 3 5 6x x x x ↑ x

    이렇게 바뀌게 된다. 즉, erase의 역할이 해당 it를 삭제하고 다음으로 이어지는 증감문의 역할을 하기 때문에 vector의 it를 사용할 경우에는 본문에서 it+를 쓰는 편이 코드를 작성할 때 유연하게 작성할 수 있게 된다.

    이 코드의 결과는 무엇이 되는가.일단 *it은 4니까 처음에는 4가 출력된다 그리고 erase를 거쳐 뒤의 it를 다시 *it로 참조하면 5가 나온다.

    4. 마지막 코드 확인.마지막으로 iteration을 돌리면 위에서 4를 지웠기 때문에 '01', '2', '356'이라는 결과가 된다는 것을 알 수 있다.

Designed by Tistory.