카테고리 없음

STL Vector 두번째

건축직일상 2015. 10. 22. 12:46

vector - 동적배열컨테이너를 제공하는 클래스 템플릿

임의접근 가능 (인덱스로 접근이가능)

원소 맨앞에 추가를 하지못함

임의의 위치에 삽입/ 삭제하면 임의의 위치로부터 저장된 원소의 개수에 비례하는 시간을 필요로한다

중간삭제 삽입시에 메모리 이동이 발생


그래서 속도저하가 있을수있다

벡터의 크기가 예약된 크기보다 늘어나게 되면 메모리의 재할당, 복사, 삭제, 연산작업이 일어나기때문에 속도저하가 있을수있다

재할당증가량은 컴파일러마다 다를수있다 

벡터의 요소를 지운다고해도 할당된 공간자체가 지워지진않는다


//벡터의 메모리 할당정책


vector<int> vecTest;

cout << vecTest.size() <<"\t"<< vecTest.capacity()<< endl;

vecTest.push_back(10);

cout << vecTest.size() <<"\t"<< vecTest.capacity()<< endl;

vecTest.push_back(20);

cout << vecTest.size() <<"\t"<< vecTest.capacity()<< endl;

vecTest.push_back(30);

cout << vecTest.size() <<"\t"<< vecTest.capacity()<< endl;

vecTest.push_back(40);

cout << vecTest.size() <<"\t"<< vecTest.capacity()<< endl;

vecTest.push_back(50);


이런식으로 할당


재할당 되는 크기는 (capacity + 이전의 capacity) / 2 만큼 일어남

size 와 capacity 는 다른것이다


size - 벡터가 현재 가지고있는 요소의 개수

capacity - 벡터가 메모리 재할당없이 가질수있는 요소의 최대개수 


vecTest<int>    vecTest2(5);

cout << vecTest2.size()  << "\t" << vecTest2.capacity() << endl; // 5     5

//이렇게 하면 인덱스 첨자를 바로 사용가능 // 요소와 공간을 같이 만들어놓은것 


vecTest2.resize(10); //사이즈 10개할당

vecTest2.resize(5); // 사이즈 5개

//이런식으로 사이즈를 줄이면 위험하다 // 사이즈는 줄어들지몰라도 capacity 는 줄어들지않는다

//사용할것 같진 않다


vecTest2.pop_back() ; //직접적으로 맨뒤에것을 pop시키기때문에 직접 이작업을통해 요소를 뺄거같지는않다


//반복자.......


1.    입력반복자 - 현위치에 원소를 한번만 읽을수있는 반복자

2.    출력반복자 - 현위치에 원소를 한번만 쓸수있는 반복자

3.    순방향 반복자 - 입출력 반복자 기능에 순방향 ++ 로 이동이 가능한 반복자

4.    양방향 반복자 - 순방향이동에 역방향 이동이 가능한 반복자 ///////아마 이것만 쓸거같음

5.    임의 접근 반복자 - 양방향 반복자에 +, - . += , -=, [], 다되는 반복자


vector.begin() 는 벡터의 시작부분

vector.end() 는 vector 의 마지막요소를 가리키는것이 아니라 마지막 요소의 다음공간을 가르킨다 


begin(), end()  는 순차열의 시작과 끝을 나타낸다 // 반개구간 이라고함  두개의 사이를 Range 라고한다


//////////////////////////////////////////////////


vecTest<int>    vecTest3;


for(int i = 0; i < 4; ++i)

{

vecTest3.push_back((i + 1) * 10);

}


vector<int>::iterator iter = vecTest3.begin();


vector<int>::const_iterator citer = vecTest3.begin() + 1;


const vector<int>::iterator const_iter = vecTest.begin() + 2;


const vector<int>::const_iterator const_citer = vecTest3.begin() + 3;


(*iter) = 100;

++iter ;

//둘다가능 하지


//*citer = 200; // const 이기때문에 이터레이터가 가리키는요소의 값을 바꿀수는없다

++citer; // 이터레이터가 가리키는 위치는 이동이 가능

cout << *citer << endl;



*const_iter = 200;    //가리키는 요소의 값을 바꿀수있음

//++const_iter; // 가리키는 위치를 바꿀수는 없다 


//*const_citer = 400; // 이터레이터가 가리키는 요소의 값 바꿀수없음

//++const_citer; // 가리키는 위치도 바꿀수없음