vector 라이브러리
선행
* vector 라이브러리는 STL 중에 하나이다.
[C++] STL - Standard Template Library
STL - Standard Template Library STL * C++에서 제공하는 표준 라이브러리이다. * STL을 사용해 기본적인 자료구조를 구현, 사용할 수 있다. (리스트, 큐, 스택, 맵, 셋, 등등...) * 이러한 저장 공간을 Container라
licktwice.tistory.com
* vector는 동적 배열이다.
[자료구조] 동적 배열 특징
동적 배열 특징 배열의 특징 * 배열이라고 하면 기본적으로 생각하는 특징들이 있다. * 인덱스를 사용해 요소에 접근한다. * 메모리는 빈틈없이 이어져 있는 하나의 덩어리다. * 데이터의 순서를
licktwice.tistory.com
std::vector
* #include <vector>를 통해 사용
* 템플릿이기 때문에 어떤 자료형도 넣을 수 있는 동적 배열이다.
* 연속된 메모리이기 때문에
포인터와 offset을 사용해 요소 접근이 가능하다.
* 순서에 상관없이 요소 접근이 빠르다.
(어떤 요소든지 접근이 O(1))
* 마지막 요소 추가, 삭제가 빠르다. O(1)
반대로 중간 요소의 추가, 삭제가 느리다. O(n)
* 연산자 오버로딩이 잘 되어있다.
정적 배열처럼 사용할 수 있고, 비교 연산자도 된다.
size와 capacity
* capacity = 동적 배열의 전체 크기 (전체 메모리 바이트 / 요소 1개 바이트)
* size = 유효한 데이터가 들어가 있는 크기
vector 생성자
vector<int> v1;
* vector 객체는 생성되는데, 동적 배열 메모리 capacity는 0이다.
vector<int> v2(10);
* 배열 크기를 10으로 생성한다.
동적 메모리니까 0으로 초기화해준다.
vector<int> v3 = { 1, 2, 3, 4, 5, 6, 7};
* 배열 크기를 딱 넣은 만큼만 잡아줌.
vector<int> v4;
v4.reserve(10);
* 빈 vector 생성 즉시 reserve를 호출하면
최적화가 일어나서 한 번만 할당한다.
vector 함수
// 예제
int size = 20;
vector<int> v1(size);
v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
* v1.capacity();
배열 전체 크기 반환
return == 20
* v1.size();
배열 사용하고 있는 크기 반환
return == 10
* v1.pop_back();
맨 뒤에 요소를 빼낸다.
배열에서 삭제하고 반환 (size - 1)
return == 10
* v1.push_back(data);
맨 뒤에 data를 추가한다. (size + 1)
* v1.resize(num);
vector의 크기를 num으로 바꾼다.
reserve와 달리 축소도 가능
* v1.clear();
size = 0, capacity = 유지
* v1.assign(num, data);
data값을 num번 반복해 넣는다.
기존 데이터는 전부 사라지고 처음부터 넣음!
* v1.swap(v2);
v1과 v2의 데이터를 바꾼다. (같은 자료형끼리만 가능)
근데 무거운 계산이 아니다.
포인터, size, capacity 같은 정보만 교체하면 되니까 가벼움
vector.reserve(num);
* 배열의 크기를 num으로 늘린다.
* num이 기존의 capacity보다 작거나 같다면?
>> 아무 일도 일어나지 않는다. 축소도 안 일어남.
* 배열의 크기는 어떻게 커질까?
>> 동일한 공간이 그냥 커질 수도 있다.
>> 다른 곳에 새로운 배열을 만들고 복사 대입한다.
* 배열을 축소하고 싶다면?
>> resize(size_t size);를 사용하자
>> 초과된 데이터는 버려버림
iterator 반복자 사용
vector<int> v1 = { 1, 2,3,4,5,6,7,8,9,10 };
cout << "iterator를 사용한 순방향" << endl;
vector<int>::iterator iter = v1.begin();
for (; iter != v1.end(); iter++) {
cout << *iter << " ";
}
cout << "\nreverse iterator를 사용한 역방향" << endl;
vector<int>::reverse_iterator re_iter = v1.rbegin();
for (; re_iter != v1.rend(); re_iter++) {
cout << *re_iter << " ";
}
* vector에서 반복자는 포인터처럼 사용하면 된다.
* 특이한 점은 역방향이 따로 존재한다는 것.
reverse_iterator++가 end >> begin 방향
순방향, 역방향 iterator
* 순방향은 iterator
vector.begin()과 vector.end()를 사용
* 역방향은 reverse_iterator
vector.rbegin()과 vector.rend()를 사용
* 함수가 반환하는 포인터 위치가 이상해 보이지만
생각 없이 사용할 수 있도록 편의성으로 만들어 놓은 것.
iterator를 사용한 요소 삽입/삭제
vector<int> v1 = { 1, 2,3,4,5,6,7,8,9,10 };
/* 4번째 요소 접근 */
vector<int>::iterator iter = v1.begin() + 3;
iter = v1.insert(iter, 777);
* iterator vector::insert(iterator position, value)
position = 삽입할 요소 위치
value = 추가하는 값
return = 삽입한 요소 위치
* position 위치에 value를 추가하고,
요소 위치를 반환한다.
vector<int> v1 = { 1, 2,3,4,5,6,7,8,9,10 };
vector<int>::iterator iter = v1.begin() + 3;
iter = v1.erase(iter);
* iterator vector::erase(iterator position)
position = 삭제할 요소 위치
return = 삭제한 요소 위치
귀여운 그림은 낡은 창고님이 그리셨습니다.
'C++' 카테고리의 다른 글
[C++] 직접 만들어보는 std::list 라이브러리 (0) | 2022.12.25 |
---|---|
[C++] 직접 만들어보는 std::vector 라이브러리 (0) | 2022.12.23 |
[C++] STL - Standard Template Library (0) | 2022.12.22 |
[C++] 유니크 포인터 unique_ptr (0) | 2022.07.10 |
[C++] 참조 Reference (8) | 2022.07.04 |