카테고리 없음

[c++] vector가 머예요? (1)

2ivii 2024. 7. 7. 22:37

오늘은 나의 !!첫 라이브러리!! vector에 대해 알아보려한다.

백트래킹 영상을 보는데, <vector>이런거를 사용하는 것을 보고 알아야되겠군아.. 라는 생각에 찾아보았다.  

 

C++의 vector는 C++ 표준라이브러리(Standard Template Library)에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class이다. vector를 생성하면 메모리 heap에 생성되며 동적할당된다. (자료구조 수업에서 노드도 heap에 생성되고, 접근은 stack에서 한다했는데 vector도 동적할당이라 그런지 heap에 생성되는 것을 볼 수 있다 !!)

 

사용법에 대해 본격적으로 알아보자

 

vector 초기화

 

- vector<자료형> 변수 :  벡터 생성

- vector<자료형> 변수명(숫자) : 숫자만큼 벡터 생성 후 0으로 초기화

 

...

 

이렇게 설명을 하려니 가시성이 너무 안좋아 그냥 코드로 바로 보겠다.  

 

vector<int> v;        //int형 백터 생성

vector<int>v(4);	  //int형 백터 생성 후 크기를 4로 할당(모든 백터요소 0으로 초기화)

vector<int>v = { 1, 2, 3};        //int형 백터 생성 후 1, 2, 3 으로 초기화

vector<int>v[] = {{ 1, 2}, {3, 4}};        //int형 백터 배열 생성(행은 가변이지만 열은 고정)

vector<vector<int>> v;        //2차원 백터 생성(행과 열 모두 가변)

vector<int> v = { 1, 2, 3, 4, 5};        //백터 범위를 5로 지정하고 정수 10으로 초기화
v.assign(5, 10);    //output : 10 10 10 10 10

 

v.assign(5,10)에 추가설명하자면, v라는 벡터에 (범위, 초기화 원하는 값)을 통해 초기화하는것이기 때문에 5범위만큼 10으로 다 초기화된것이다. 

 

  vector 요소접근

 

1. v.front() : 맨 앞 요소 접근

2. v.back() : 맨 뒤 요소 접근

3. v.at(i) : i번째 요소 접근

4. v.[i] : i번째 요소 접근

 

 i번째 요소 접근하는게 두개나 있다!! 이 두 개의 차이는.. 바로 범위 검사 유무이다 . at이 범위 검사를 하고, []가 범위 검사를 안 한다. 그래서 at은 예외 처리를 발생시키지만, []는 예외처리를 발생시키지 않으며 해당 범위 밖의 요소에 접근하려하면 일반적인 디버깅이 발생한다. 그럼 뭐를 자주 쓸까 !! 범위검사를 해주는 at을 많이 쓸 줄 알았는데 vector는 효율을 중점으로 하는 라이브러리이기때문에 []를 많이쓴다고 한다. 그리고 권장한다고 한다.  

vector<int> v = { 1, 2, 3, 4};

cout << v.front() << endl;        //output : 1
cout << v.back() << endl;        //output : 4
cout << v.at(1) << endl;        //output : 2
cout << v[2] << endl;            //output : 3​

 

역시 코드를 봐야 한눈에 이해하기 쉬운듯 !

 

vector 이터레이터

 

1. v.begin() : 벡터의 시작점의 주소 반환

2. v.end() : 벡터의 마지막+1의 주소 반환

 

즉 v.begin()을 출력하면 주소가 나온다! (인덱스가 나오는 것이 아님! 나만 그런건지 모르겠지만 난 인덱스라고 생각했었는데 .. 그게 아니었다 !) 그리고 *begin을 하면 첫번째 요소의 값이 나온다 !

int main() {
    vector<int> v = {1, 2, 3, 4};

    cout << "v.begin(): " << v.begin() << endl;  // 반복자가 가리키는 메모리 주소 출력 (ex. 0x7ffeedb36f60)

    cout << "*v.begin(): " << *v.begin() << endl;  // 벡터의 첫 번째 요소 출력 (1)

    return 0;
}

 

여기서 주의할 점 !! 마지막 요소 가져와야지 ~ 하고 *end하면 안된다 !! 왜냐하면 end는 마지막의 다음 주소를 갖고이기때문에 오류가 난다 !!

 

 

vector에 요소 삽입

 

1. v.push_back() : 마지막에 요소 삽

2. v.pop_back() : 마지막 부분 삭제

3. v.insert(삽입할 위치의 주소 값, 변수 값) : 원하는 위치에 삽입

4. v.erase(삭제할 위치) or v.erase(시작위치, 끝위치) : 원하는 index의 값들을 지운다.

5. v.clear() : 모든 벡터의 요소를 지운다.

6.  v.resize(수정 값) :  벡터의 사이즈를 조정한다. 범위 초과시, 0으로 채운다.

 

int main(){
    vector<int> v;

    v.push_back(10);		//v= { 10 }
    v.push_back(20);        //v = { 10, 20 }

    v.insert(v.begin() + 1, 100);     // v = { 10, 100, 20 }
    
	v.pop_back();        // v = { 10, 100 }
    
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);		//v= { 10, 100, 30, 40, 50 }
    
    v.erase(v.begin() + 1); // v = { 10, 30, 40, 50 }
    v.resize(6);    // v = { 10, 30, 40, 50, 0, 0 }
    v.clear();    // v = empty()     
}

 

코드를 통해 보니 확실히 알 수 있는 거 같다. emplace뭐시기도 있던데 복사생성자와 move에 대해 설명하던데.. 치킨이 와서 다음시간에 이어서 보겠다! 그래도 vector의 첫 단추는 대강 끼워본 것 같다!!