본문 바로가기
IT 컴퓨터_프로그램 /c++

STL Vector 기초

by 건축직일상 2015. 10. 20.

#include<iostream>

//벡터 인클루드


#include<vector>

using namespace std;


//벡터 레퍼런스를 받아서 

template <typename T>

void FitCapacity(vector<T>& rVecSource)

{

//새로운 임시변수 벡터를 만듬

//복사생성하면서

vector<T> vecDest(rVecSource);

//레퍼런스로 들어온 벡터랑 새로 생성한 벡터를 바꿔치기함 

//그럼 중괄호 끝나면 새로만든애는 없어진다 .

rVecSource.swap(vecDest);

}

void main(void)

{


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

//임의 접근 가능 (인덱스접근가능)

//원소 맨앞에 추가못해

//임의의 위치에 삽입 /삭제하면 임의의 위치로부터

//저장된 원소의 개수에 비례하는 시간을 필요로 한다 

//중간 삽입삭제시 메모리 이동이 발생한다 


//때문에 속도가 저하될수있다. 

//벡터의 크기가 예약된 크기보다 늘어나게 되면

//메모리 재할당, 복사, 삭제 작업이 일어나기 때문에 

//속도가 좀 느려질수있다 

//재할당증가량은 컴파일러에 따라 다르다 

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


//벡터의 선언

//

vector<int> vecTest;


//size벡터 현재 요소의 개수를 리턴해준다

cout << vecTest.size() << endl;

//reserve() 벡터의 공간을 미리 예약하는 함수 

//vecTest.reserve(10);

//벡터가 현재 메모리 재할당없이 가질수 있는 원소의 개수

//할당정책에따라 갯수 달라짐


cout <<"capacity " << vecTest.capacity() << endl;


cout << "======================== "  << endl;


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

{

vecTest.push_back(i);

//컨테이너 맨뒤에 요소를 추가한다

}


cout << vecTest.size() << endl;

cout <<"capacity " << vecTest.capacity() << endl;

cout << "===============" << endl;


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

{

vecTest.pop_back();

//벡터 컨테이너 맨뒤의 요소를 뺀다 

}

cout << vecTest.size() << endl;

cout <<"capacity " << vecTest.capacity() << endl;

//벡터의 요소를 추가할때마다 벡터는 재할당이 되어 큰용량가지지만

//요소를 제거한다고 해도 실제 용량은 줄어들지 않는다


vecTest.reserve(10);

cout << vecTest.size() << endl;

cout <<"capacity " << vecTest.capacity() << endl;


//늘어난 cpapcity 줄일수는 있다 

FitCapacity(vecTest);

cout << vecTest.size() << endl;

cout <<"capacity " << vecTest.capacity() << endl;

//램덤엑세스

//벡터는 인덱스통한 랜덤엑세스 가능

cout << "=====================" << endl;

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

{

vecTest.push_back(i);

}

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

{

cout << vecTest[i]  <<"\t";

}

//원소가 하나의 메모리 블록에 연속적으로 저장된다

//원소추가 시메모리 재할당이 일어날수 있다.

//배열기반이니까 push_front ,pop_front 같은 멤버함수는 제공하지 X

//인덱스를 통해서 원소에 접근하기때문에 순회 속도가 빠르다 //편하다

//




vector<int> vecTest;

vecTest.push_back(10);

vecTest.push_back(20);

vecTest.push_back(30);

for(vector<int>::size_type i = 0; i < vecTest.size(); ++i)

{

cout << vecTest[i] << "\t" ;

}


////// //추천한다 이방법

int iSize = vecTest.size();

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

{

cout << vecTest[i] << "\t" ;

}

cout << endl;

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


for(int i = 0, j = vecTest.size(); i < j; ++i)

{

cout << vecTest[i] << "\t" ;

}


/////////정석방법

vector<int>::size_type iSize2 = vecTest.size();

for(vector<int>::size_type i = 0; i < iSize2; ++i)

{

cout << vecTest[i] << "\t" ;

}

cout << endl;


size_t i = vecTest.size();


//유니코드 멀티파이트 둘다지원

//_tcscpy


//벡터를 선언할때 요소의 개수를 지정할수있다 

vector<int> vecTest2;

vecTest2.reserve(3);


vecTest2[0] = 10;

vecTest2[1] = 20;

vecTest2[2] = 30;


//이거안됨


vector<int> vecTest3(3);

vecTest3.reserve(3);


vecTest3[0] = 10;

vecTest3[1] = 20;

vecTest3[2] = 30;


for(size_t i = 0; i < vecTest3.size() ; ++i)

{

cout << vecTest3[i] <<"\t";

}

cout << endl;

cout << "==================== "<< endl;

//벡터의 요소를 전부다 비운다

vecTest3.clear();

cout << vecTest.size() << endl;

cout <<"capacity " << vecTest3.capacity() << endl;

vecTest3.push_back(20);


//벡터가 비어있는지 아닌지를 확인이 가능한 함수도 있다

if(vecTest3.empty() == true)

{

cout << "vecTest - empty" << endl;

}

else

{

cout << "vecTest - not empty " << endl;

}

//멤버함수중에 front , back 

//front 맨앞의 위치

//back 맨뒤의 위치를 뜻함 

for(size_t  i = 0 ; i < 5; ++i)

{

vecTest3.push_back(i);

}

vecTest3.front() = 100;

vecTest3.back() = 200;

for(size_t i = 0; i < vecTest3.size(); ++i)

{

cout << vecTest3[i] <<"\t";

}

cout <<  endl;




//반복자 (iterator)

//포인터와 비슷하게 동작한다

//원소를 순회하고 접근하는 일반적인 방법을 제공하는것이 반복자다

//STL컨테이너는 자신만의 반복자를 제공한다

//반복자는 *연산자 오버로딩을 제공하기때문에 반복자에 *붙이면

//해당반복자가 가리키는 요소가 나온다 


cout << *(vecTest3.begin());

//begin() 은 컨테이너의 시작요소를 가리키는 반복자다 

//end()는 컨테이너의 마지막요소 가 아니라 마지막요소의 다음위치를 가르킨다

vecTest3.end();


//* 해당반복자가 가리키고 있는 요소

// ++ 다음요소

// -- 이전요소

// != 두반복자가 같은 위치를 가리키고 있는지 비교

// == 비교

// = 반복자에 대입한다 



//반복자 혹은 반복문을 돌릴때 후위연산을 하지말고 전위연산 위주로 사용하자 

//++obj; --obj;

//obj++;


//컨테이너명::iterator 반복자이름;

//이런식으로 선언한다

//원소들을 읽기 / 쓰기가 가능


///////컨테이너 중에 랜덤엑세스 가능한것들은 

//반복자가 앞뒤가 이동이 가능한것

//양방향 반복자라고 말함

// 반복자 +=1; -=2; 이런연산이 가능하다 (list는안됨)


//iterator 는 스마트포인터 객체 

//스마트 포인터는 나중에 수업중에 공부하자

//


vector<int> vecTest4;

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

{

vecTest3.push_back(i);

}


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

vector<int>::iterator iter_end = vecTest4.end();


for(iter; iter != iter_end; ++iter)

{

cout << *iter << endl;

}


//반복자는 다섯가지로 나뉜다


//1.입력 반복자

//2.출력 반복자

//3.순방향 반복자

//4.역방향 반복자

//벡터는 이거 //5. 양방향 반복자

//6. 임의 접근 반복자

//iter += 2;

//cout << *iter << endl;

이것도 가능해




}



'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글

STL 기초 학습  (0) 2015.10.20
메크로함수  (0) 2015.10.18
템플릿  (0) 2015.10.18
연산자 오버로딩  (0) 2015.10.18
오버라이딩_virtual2  (0) 2015.10.13

댓글