프로그래밍/C++

STL vector 정리

우대비 2022. 11. 2. 18:37
반응형

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