반응형
vector는 동적인 배열임!
특징 - 할당받은 메모리를 다 사용하면 메모리를 추가로 더 할당받음
동적할당
for (int i = 0; i < 1000; i++)
{
v.push_back(100);
cout << v.size() << " " << v.capacity() << endl;
// size는 vector의 실제 사용 데이터 개수를 불러옴
// capacity는 할당 받은 메모리로 몇개의 데이터를 사용할 수 있는지 보여줌
}
위 코드를 실행시켜보면 size가 capacity와 같아질때 capacity의 사이즈가 1.5배씩 커지는걸 볼 수 있음
배열과 비교
- 정의
vector<int> v(10); // int형 vector를 10개 만든거
int n[10]; // int형 변수를 10개 만든거
- 초기화
for (vector<int>:: size_type i = 0; i < v.size(); i++)
v[i] = i;
for (int i = 0; i < 10; i++)
n[i] = i;
이렇듯 굉장히 비슷하게 사용이 가능함
Vector 기초
iterator
vector<int>::iterator it; // 내부적으로 포인터를 들고있음
int* ptr;
- iterator 포인터와 같은 객체라고 볼 수 있음
필수정보
v.push_back(1); // 뒤에다 넣기
v.pop_back(); // 뒤에있는거 빼기
v.begin(); // 맨 앞에있는 iterator를 뱉음
v.end(); // 마지막 주소의 다음 주소의 iterator를 뱉음
// end()는 for(주소 = 주소; 주소!=end(); 주소++) 이런식으로 쓰임
// vector의 3번째 위치에 5를 넣음 ---> 기존에 있던 데이터들 전부 한칸씩 뒤로 옮겨짐
vector<int>::iterator insertIt = v.insert(v.begin() + 2, 5);
// vector의 3번째 위치한 데이터를 삭제하고 그곳의 iterator를 반환함
vector<int>::iterator eraseIt1 = v.erase(v.begin() + 2);
// 3번째 ~ 4번째까지 5번째는end()처럼 인식해서 삭제 안함
vector<int>::iterator eraseIt2 = v.erase(v.begin() + 2, v. begin() + 4);
흔히하는 실수!
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
int data = *it;
if (data == 3)
{
v.erase(it);
}
} // 안됨!!
for (vector<int>::iterator it = v.begin(); it != v.end();)
{
int data = *it;
if (data == 3)
{
it = v.erase(it);
}
else
{
++it;
}
} // 됨!
- it를 erase로 지우고 ++it를 해버리면 당연히 안됨!
삽입과 삭제
// - 중간 삽입 / 삭제 [ BAD / BAD ]
// - 처음 삽입 / 삭제 [ BAD / BAD ]
// - 끝 삽입 / 삭제 [ GOOD / GOOD ]
- vector는 중간에 끊김 없이 이어져야함 ( v[1]을 없앴다고 0 다음 2가 오면 안됨)
따라서 "중간, 맨 앞에 있는 데이터"를 삭제하면 "그 뒤에 있는 모든 데이터"를 "삭제한 데이터"만큼 앞으로 땡겨야함
즉 굉장히 비효율적
그렇기 때문에 vector에서의 데이터 삽입과 삭제는 웬만하면 끝에서 이루어져야함
// - 임의 접근
반응형
LIST
'프로그래밍 > C++' 카테고리의 다른 글
STL deque 정리 (1) | 2022.11.04 |
---|---|
STL list 정리 (0) | 2022.11.03 |
클래스 템플릿 (0) | 2022.11.01 |
함수 템플릿 (0) | 2022.11.01 |
함수 객체 (0) | 2022.11.01 |