오늘은 나의 !!첫 라이브러리!! 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의 첫 단추는 대강 끼워본 것 같다!!
