티스토리 뷰

안녕하세요! 관광이 개발블로그의 관광이 입니다

이번에 알아볼 STL의 종류중 하나인 VECTOR에 대해서 살펴보겠습니다.


1. Vector Container


VectorContainer는 자동으로 메모리가 할당되는 배열이라고 합니다. 


대표적인 메소드로는

- v.front() - 가장 앞 위치

- v.back() - 마지막 위치

- v.push_back() - 가장마지막에 원소 push

- v.pop_back() - 가장 마지막 원소 pop


맨뒤쪽에서 삽입과 삭제가 가능하다.



2. Vector Container 사용시 필요한 사항

#include <vector>


== vector<int> v; 라고 가정.

== 참조 한다는 것은 해당 데이터를 리턴 한다는 뜻입니다.



v.assign(5, 2);

- 2의 값으로 5개의 원소 할당.


v.at(idx);

- idx번째 원소를 참조합니다. 

- v[idx] 보다 속도는 느리지만, 범위를 점검하므로 안전합니다.


v[idx];

- idx 번째 원소를 참조합니다.

- 범위를 점검하지 않으므로 속도가 v.at(idx)보다 빠릅니다.


v.front();

- 첫번째 원소를 참조합니다.


v.back();

- 마지막 원소를 참조합니다.


v.clear();

- 모든 원소를 제거합니다.

- 원소만 제거하고 메모리는 남아있습니다.

- size만 줄어들고 capacity는 그대로 남아있습니다.


v.push_back(7);

- 마지막 원소 뒤에 원소 7을 삽입합니다.


v.pop_back();

- 마지막 원소를 제거합니다.


v.begin();

- 첫번째 원소를 가리킵니다. (iterator와 사용)


v.end();

- 마지막의 "다음"을 가리킵니다 (iterator와 사용)


v.rbegin();

- reverse begin을 가리킨다 (거꾸로 해서 첫번째 원소를 가리킵니다)

- iterator와 사용.


v.rend();

- reverse end 을 가리킨다 (거꾸로 해서 마지막의 다음을 가리킵니다)

- iterator와 사용.


v.reserve(n);

- n개의 원소를 저장할 위치를 예약합니다(미리 동적할당 해놉니다)


v.resize(n);

- 크기를 n으로 변경한다.

- 더 커졌을 경우 default값인 0으로 초기화 한다.


v.resize(n,3);

- 크기를 n으로 변경한다.

- 더 커졌을 경우 인자의 값을 3으로 초기화한다.


v.size();

- 원소의 갯수를 리턴한다.


v.capacity();

- 할당된 공강의 크기를 리턴한다.

- 공간 할당의 기준은 점점 커지면서로 capacity를 할당하게 됩니다.

- dev c++ 기준으로 string 클래스로 vector 를 만들었을때.


원소 갯수 1 => capacity 1

원소 갯수 2 => capacity 2

원소 갯수 3 => capacity 4

원소 갯수 4 => capacity 4

원소 갯수 5 => capacity 8

원소 갯수 6 => capacity 8

원소 갯수 7 => capacity 8

원소 갯수 8 => capacity 8

원소 갯수 9 => capacity 16

을 봐서는 2^n으로 capacity의 메모리 할당이 되지 않나 싶습니다.(아래에서 테스트 해보겠습니다)

이런식으로 메모리 할당을 하는 이유는 push_back이 일어날때 마다 동적할당을 하면,

비효율적이므로 미리 정해둔 만큼 동적할당을 한번에 하는 것 입니다.


**capacity와 size는 다

size는 할당된 메모리 안에 요소가 들어있는것의 갯수.

capacity는 할당된 메모리의 갯수? 크기.




3. vector의 멤버 형식


iterator - 반복자 형식

reverse_iterator - 역 반복자 형식

value_type - 원소의 형식

size_type - 원소의 개수의 형식



4. vector 출력


#include<iostream>

#include<vector>

using namespace std;


int main(void){

    vector<int> v;

    

    v.push_back(21);

    v.push_back(32);

    v.push_back(53);

    v.push_back(64);

    v.push_back(15);

    

    

    //ex1) 멤버형식 size_type 이용한 반복.

    cout << "ex1-1) [v.at(i)] size_type : " ;

    for(vector<int>::size_type i =0; i<v.size(); i++){

        cout << v.at(i) << " ";

    }

    cout << endl;

    cout << "ex1-1) [ v[i] ] size_type : " ;

    for(vector<int>::size_type i =0; i<v.size(); i++){

        cout << v[i] << " ";

    }

    cout << endl << endl;

    

    

    //ex2) int i 를 이용한 반복.

    cout << "ex2-1) [v.at(i)] int : " ;

    for(int i =0; i<v.size() ; i++){

        cout << v.at(i) << " ";

    }

    cout << endl;

    cout << "ex2-2) [ v[i] ] int : " ;

    for(int i =0; i<v.size() ; i++){

        cout << v[i] << " ";

    }

    cout << endl << endl;

    

    

    //ex3) 반복자 iterator를 이용한 반복.

    cout << "ex3) [*iter] iterator : ";

    vector<int>::iterator iter;

    for(iter = v.begin(); iter != v.end() ; iter++){

        cout << *iter << " ";

    }

    cout << endl << endl;

    

    

    return 0;

    

    



5. vector 삽입 삭제

#include<iostream>

#include<vector>

#include<string>

using namespace std;


int main(void){

    vector<string> v;

    

    v.push_back("Show Me");

    v.push_back("Tiger JK");

    v.push_back("Dok2");

    v.push_back("GAEKO");

    v.push_back("ZICO");

    

    //ex4) v.front(), v.back()

    cout << "//ex4) v.front(), v.back()" << endl;

    

    cout << "v.front() : " << v.front() << endl;

    cout << "v.end() : " << v.back() << endl;

    cout << endl;

    

    

    

    

    //ex5) v.popback()

    cout << "//ex5) v.popback()" << endl;

    

    vector<string>::iterator iter;

    for(iter = v.begin(); iter != v.end() ; iter++){

        cout << *iter << " / " ;

    }

    cout << endl;

    

    v.pop_back();

    

    for(iter = v.begin(); iter != v.end() ; iter++){

        cout << *iter << " / " ;

    }

    cout << endl;

    cout << endl;

    

    

    

    

    //ex6) v.erase(iter);

    cout << "//ex6) v.erase(iter)" << endl;

    

    for(iter = v.begin(); iter != v.end() ; iter++){

        if(*iter == "Dok2"){

            v.erase(iter);

            break;

        }

    }

    for(iter = v.begin(); iter != v.end() ; iter++){

        cout << *iter << " / " ;

    }

    

    

    

    cout << endl << endl;

    //ex7) v.size(), v.capacity();

    cout << "//ex7) v.size(), v.capacity()" << endl;

    

    cout << "v.size() : " << v.size() << endl;

    cout << "v.capacity() : " << v.capacity() << endl;

    

    return 0;

}


지금까지 Vector에 대해 간단히 알아보았습니다. C++ 알고리즘시 많이 사용되는 컨테이너이므로 잘 정리 해놔야겠습니다. 감사합니다.




Reference : http://blockdmask.tistory.com/70




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함