#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 |
댓글