Search Results for 'C++'

22 POSTS

  1. 2012.08.13 STL 동적 할당 해제
  2. 2012.08.13 map-소스 한개
  3. 2012.08.13 map
  4. 2012.08.13 list-소스한개
  5. 2012.08.13 list
  6. 2012.08.13 containers
  7. 2012.08.13 algorithm
  8. 2012.08.13 STL 이란 ?
  9. 2012.08.13 Run-Time Type Information
  10. 2012.08.13 explicit

STL 동적 할당 해제

Posted 2012. 8. 13. 22:19

STL은 해당 객체만 비운다.

 

동적할당은 따로 해줘야됨

 

---- vector 와 list 는 아래와 동일 ----

void Input()

{

for(iter = iter+Data.begin() ; iter != Data.end() ; )

{

Person* pTmp = new Person;      //동적할당

cout<<"이름: ";

cin>>pTmp->Name;

.......

Data.push_back(pTmp);

}

}

 

---- 해제 ㄱㄱ ----

void ClearData()

{

for(iter = iter+Data.begin() ; iter != Data.end() ; )

{

delete (*iter);      //동적 해제

}

Data.clear();            //객체 비움

}

 

 ---- map은 구성에따라 first와 second를 해제 ----

 second에 동적할당을 받았을시에..

delete (*iter).second;

'C++ > STL' 카테고리의 다른 글

iterateor  (0) 2012.08.13
containers  (0) 2012.08.13
algorithm  (0) 2012.08.13
STL 이란 ?  (0) 2012.08.13

map-소스 한개

Posted 2012. 8. 13. 22:18

#include <iostream>
#include <cstring>
#include <map>
using namespace std;

 

typedef struct PersonInfo
{
 char Name[20];
 int Age;
 char ID[20];
 char PW[20];
}Person;

 

map<int, Person*> Data;
map<int, Person*>::iterator iter;

 

void MainMenu();
int SelectMenu();

int InputNumber();
void InputData(int num);

void DataShowAll();
void DataShowSelect();

void DataDeleteSelect();
void DataDeleteAll();

 

void main ()
{
 int Select;
 int InputNum;
 while(1)
 {
  MainMenu();
  Select = SelectMenu();
  switch(Select)
  {
  case 1://입력
   InputNum = InputNumber();
   InputData(InputNum);
   break;
  case 2://전체출력
   DataShowAll();
   break;
  case 3://선택출력
   DataShowSelect();
   break;
  case 4://선택삭제
   DataDeleteSelect();
   break;
  case 5://전체삭제
   DataDeleteAll();
   break;
  case 6:
   cout<<"프로그램 종료"<<endl;
   DataDeleteAll();
   return;
   break;
  }
 };
}


void MainMenu()
{
 cout<<"----------"<<endl;
 cout<<"   map~   "<<endl;
 cout<<"----------"<<endl;
 cout<<"1.입    력"<<endl;
 cout<<"2.전체출력"<<endl;
 cout<<"3.선택출력"<<endl;
 cout<<"4.선택삭제"<<endl;
 cout<<"5.전체삭제"<<endl;
 cout<<"6.종    료"<<endl;
 cout<<"----------"<<endl;
}

 

int SelectMenu()
{
 int Select;
 cout<<"선 택 : ";
 cin>>Select;
 return Select;
}

 

int InputNumber()
{
 int num;
 cout<<"몇명 입력 : ";
 cin>>num;
 return num;
}

 

void InputData(int num)
{
 for(int i=0 ; i<num ; i++)
 {
  Person* ptmp = new Person;
  cout<<"이  름 : ";
  cin>>ptmp->Name;
  cout<<"나  이 : ";
  cin>>ptmp->Age;
  cout<<"I    D : ";
  cin>>ptmp->ID;
  cout<<"P    W : ";
  cin>>ptmp->PW;
  Data[i] = ptmp;   //배열처럼 첫번째 키값에 second로 tmp를 넣음. 이게 곧 push_back()
 }
}

 

void DataShowAll()
{
 if( Data.empty() )
 {
  cout<<"입력된 정보가 없쑴"<<endl;
  return;
 }

 for(iter = Data.begin() ; iter != Data.end() ; iter++) //
 {
  cout<<"이  름 : "<<(*iter).second->Name<<endl;
  cout<<"나  이 : "<<(*iter).second->Age<<endl;
  cout<<"I    D : "<<(*iter).second->ID<<endl;
  cout<<"P    W : "<<(*iter).second->PW<<endl;
 }
 cout<<"출력 완료"<<endl;
}

 

void DataShowSelect()
{
 if( Data.empty() )
 {
  cout<<"입력된 정보 없쑴"<<endl;
  return;
 }

 int num;
 cout<<"검색할 정보 입력"<<endl;
 cout<<"1. 이 름,  2. I  D"<<endl;
 cout<<"선  택 : ";
 cin>>num;

 char tmp[20];
 if(num == 1)
 {
  cout<<"이름 입력 : ";
  cin>>tmp;
  for(iter = Data.begin() ; iter != Data.end() ; )
  {
   if( !strcmp(tmp, (*iter).second->Name) )
   {
    cout<<"이  름 : "<<(*iter).second->Name<<endl;
    cout<<"나  이 : "<<(*iter).second->Age<<endl;
    cout<<"I    D : "<<(*iter).second->ID<<endl;
    cout<<"P    W : "<<(*iter).second->PW<<endl;
    cout<<"출력 완료"<<endl;
    return;
   }
   else
    iter++;
  }
 }
 else if(num == 2)
 {
  cout<<"I D 입력 : ";
  cin>>tmp;
  for(iter = Data.begin() ; iter != Data.end() ; )
  {
   if( !strcmp(tmp, (*iter).second->ID) )
   {
    cout<<"이  름 : "<<(*iter).second->Name<<endl;
    cout<<"나  이 : "<<(*iter).second->Age<<endl;
    cout<<"I    D : "<<(*iter).second->ID<<endl;
    cout<<"P    W : "<<(*iter).second->PW<<endl;
    cout<<"출력 완료"<<endl;
    return;
   }
   else
    iter++;
  }
 }
}

 

void DataDeleteSelect()
{
 if( Data.empty() )
 {
  cout<<"입력된 정보 없쑴"<<endl;
  return;
 }

 char tmp[20];
 int num;
 cout<<"삭제할 정보 검색"<<endl;
 cout<<"1. 이  름,  2. I  D"<<endl;
 cout<<"선  택 : ";
 cin>>num;
 if(num == 1)
 {
  cout<<"이름 입력 : ";
  cin>>tmp;
  for(iter = Data.begin() ; iter != Data.end() ; )
  {
   if( !strcmp(tmp, (*iter).second->Name) )
   {
    delete (*iter).second;         //vector와 list의 차이점은 second에 잡혀있는 메모리를 해제하는것
    iter = Data.erase(iter);
    cout<<"삭제완료"<<endl;
    return;
   }
   else
    iter++;
  }
 }
 else if(num == 2)
 {
  cout<<"I D 입력 : ";
  cin>>tmp;
  for(iter = Data.begin() ; iter != Data.end() ; )
  {
   if( !strcmp(tmp, (*iter).second->ID) )
   {
    delete (*iter).second;      //vector와 list의 차이점은 second에 잡혀있는 메모리를 해제하는것
    iter = Data.erase(iter);
    cout<<"삭제완료"<<endl;
    return;
   }
   else
    iter++;
  }
 }
 cout<<"삭제 완료"<<endl;
}

void DataDeleteAll()
{
 if( Data.empty() )
 {
  cout<<"입력된 정보 없쑴"<<endl;
  return;
 }
 for(iter = Data.begin() ; iter != Data.end() ; iter++)
 {
  delete (*iter).second;      //vector와 list의 차이점은 second에 잡혀있는 메모리를 해제하는것
 }

 Data.clear();           //그다음 clear로 객체 비움
 cout<<"전체 삭제 완료"<<endl;
}

'C++ > STL-map' 카테고리의 다른 글

map  (0) 2012.08.13

map

Posted 2012. 8. 13. 22:16

map과 multimap의 차이점

multimap은 동일한 key값을 사용할수 있지만 map은 불가능

-> Max[0] = "123";

-> Max[0] = "456";

 

 map은 first(key)와second(&val)로 되어있다.

map의 find는 key값으로만 검색이 가능하다.

second의 값을 find하려면 다른 방식을 선택하는게 좋음 

 

장 점

검색할 일이 많을떄 쓰면 용이함

 

단 점

마찬가지로 배열이라 삽입 삭제시 속도저하가 심하다

 

주 의

'C++ > STL-map' 카테고리의 다른 글

map-소스 한개  (0) 2012.08.13

list-소스한개

Posted 2012. 8. 13. 22:16

#include <iostream>
#include <cstring>
#include <list>
using namespace std;

 typedef struct PersonInfo{
 char Name[20];
 int Age;
 char ID[20];
 char PW[20];
}Person;

//유저 define type data인 경우 직접 조건을 만들어 줘야됨
 bool Comp(Person first, Person Second) //적은숫자가 앞으로 가게 정렬(오름차순 정렬)
{
 if(first.Age < Second.Age)
  return true;
 return false;
};

void MainMenu();
int SearchData();

void main()
{
 int Select;
 list<Person> Data;                                       // list로 Data 선언
 list<Person>::iterator iter;                             // list의 내부 참조자 변수만듬
 while(1)
 {
  MainMenu();
  cin >> Select;
  switch(Select)
  {
  case 1:       //입 력
   Person temp;
   cout << "이  름 : ";
   cin >> temp.Name;
   cout << "나  이 : ";
   cin >> temp.Age;
   cout << "I    D : ";
   cin >> temp.ID;
   cout << "P    W : ";
   cin >> temp.PW;
   Data.push_back(temp);                           //데이터 밀어넣기
   cout <<"입력완료"<<endl;
   break;
  case 2:       //출 력
   if( Data.empty() )
   {
    cout<<"등록된 정보가 없다"<<endl;
    continue;
   }
   else
   {
    for(iter=Data.begin() ; iter != Data.end() ; iter++)                        //Data.begin() -> 시작점,   Data.end() ->끝점
    {
     cout<<"이  름:"<<(*iter).Name<<endl;;                                 // iter로 데이터 접근
     cout<<"나  이:"<<(*iter).Age<<endl;
     cout<<"I    D:"<<(*iter).ID<<endl;
     cout<<"P    W:"<<(*iter).PW<<endl;
    }
    cout<<"출력완료"<<endl;
   }
   break;
  case 3:       //나이순 정렬
   if( Data.empty() )                                                               //Data.empty() ->비었으면 false, 있으면 true
   {
    cout<<"정렬할 정보가 없다"<<endl;
    continue;
   }
   else
   {
    Data.sort(Comp);   //
    cout<<"나이순 정렬완료"<<endl;
   }
   break;
  case 4:       //검색삭제
   if(SearchData() == 1)  //이 름
   {
    char strname[256];
    cout << "이 름 : ";
    cin >> strname;

    for(iter = Data.begin() ; iter != Data.end() ; )
    {
     if( !strcmp((*iter).Name, strname) ) //같은게 있으면
     {
      iter = Data.erase(iter);                                                      //Data.erase() ->선택부분 삭제
      cout<<"삭제 완료"<<endl;
     }
     else
      iter++;
    }
   }
   else if(SearchData() == 2) //아이디
   {
    char strid[256];
    cout<<"I   D : ";
    cin>>strid;
    for(iter = Data.begin() ; iter != Data.end() ; )
    {
     if( !strcmp( (*iter).ID, strid) ) //같은게 있으면
     {
      iter = Data.erase(iter);
      cout<<"삭제 완료"<<endl;
     }
     else
      iter++;
    }
   }
   break;
  case 5:       //전체삭제
   if( Data.empty() )
    cout<<"등록된정보가없다"<<endl;
   else
   {
    Data.clear();                                                         //Data.clear() -> 전체 삭제
    cout<<"전체삭제완료"<<endl;
   }
   break;
  case 6:       //종료
   Data.clear();
   cout<<"프로그램종료함"<<endl;
   return;
   break;
  }
 }

}
void MainMenu()
{
 cout << "--------------" <<endl;
 cout << "     List     " << endl;
 cout << "--------------" <<endl;
 cout << "1.입      력" << endl;
 cout << "2.출      력" << endl;
 cout << "3.나이순정렬"<<endl;
 cout << "4.검색 삭제" << endl;
 cout << "5.전체 삭제" << endl;
 cout << "6.종     료" << endl;
 cout << "--------------" <<endl;
 cout << "선     택 : ";
}
int SearchData()
{
 int i;
 cout << "검색할 목록 선택" << endl;
 cout << "1.이 름  2.I  D" << endl;
 cout << "선택 : ";
 cin >> i;
 return i;
}

'C++ > STL-list' 카테고리의 다른 글

list  (0) 2012.08.13

list

Posted 2012. 8. 13. 22:15

리스트(std::list)

장 점

  1. 더블 링크드 리스트 형식
  2. 삽입 삭제 시에도 속도가 빠르다.

단 점

  1. 임의 접근이 불가능하다.

 

가능한점

  1. 크기 변경
  2. 중간 삽입 삭제
  3. 순차 접근

 

원본>  http://blog.naver.com/bravedog/100005053219

■ list의 능력

list의 내부 자료구조는 vector, deque와는 완전히 다르다. 그러므로 vector, deque와 비교를 할 때

다음과 같은 차이점이 보인다

  ● list는 랜덤 액세스를 지원하지 않는다. 예를 들어, 5번째 원소를 액세스하기 위해서 list는 앞의

     1~4번째 원소를 거쳐서 액세스하게 된다. 그러므로 특정 위치의 원소를 액세스하는 경우 속도

     는 느릴 것이다.

  ● 어떠한 위치에서건 삽입과 삭제가 빠르게 이루어진다. 다른 원소들은 이동될 필요가 없기

     때문에 삽입, 삭제 동작은 상수 시간 복잡도를 가지게 된다. 내부적으로 보자면, 단지 포인터

     값들만 조작하면 그만이다.

  ● 삽입과 삭제 동작이 모든 포인터와 레퍼런스, 그리고 반복자를 무효화시키지는 않는다.

  ● list는 거의대부분의 동작들이성공하거나 아니면 아무런 영향도 받지않는 예외핸들링을 제공한다.


list의 멤버 함수들은 vector와 deque와의 다른 점들을 반영한다

  ● list는 [] 연산자와 at()을 제공하지 않는다. 왜냐하면, 랜덤 액세스를 지원하지 않기 때문이다.

  ● list는 용량과 재할당과 관련된 함수들을 제공하지 않는다. 왜냐하면, 두 함수 모두 필요없기

    때문이다.

    각각의 원소들은 자신만의 메모리를 가지고 있으며 이것은 원소가 지워지기 전까지 유효하다.

  ● list는 원소를 이동시키기 위한 특별한 멤버 함수들을 제공한다. 이 멤버 함수들은 같은 이름의

    STL 알고리즘보다 빠르게 동작한다. 왜냐하면, 알고리즘은 이들을 복사한 후 이동하지만,

    멤버 함수으 lruddn는 단지 포인터 값만 재지정하기 때문이다.


 

■ list의 생성자와 소멸자

동작

효과

list<Elem> c

원소 원이 빈 list를 생성한다

list<Elem> c1(c2)

같은 타입의 다른 list를 복사하여 생성한다(모든 원소들은 복사된다)

list<Elem> c(n)

디폴트 생성자에 의해서 생성되는 n개의 원소와 함깨 list를 생성한다

list<Elem> c(n,elem)

elem 원소의 n개의 복사본으로 list를 초기화하여 생성한다

list<Elem> c(begn,elem)

[beg,end) 범위의 원소로 list를 초기화하여 생성한다

c.~list<Elem>()

모든 원소들을 파괴하고 메모리를 해제한다


 

■ list의 수정하지 않는 동작들

동작

효과

c.size()

실제 원소의 개수를 반환한다

c.empty()

컨테이너가 비어있는지를 판단한다 (size()==0와 동일하나 더 빠르다).

c.max_size()

컨테이너가 가질 수 있는 최대 원소의 개수를 반환한다.

c1 == c2

c1과 c2가 같은지 판단한다

c1 != c2

c1과 c2가 다른지 판단한다 ( !(c1==c2)와 동일하다 ).

c1 < c2

c1이 c2보다 작은지를 판단한다

c1 > c2

c1이 c2보다 큰지를 판단한다( c2<c1과 동일하다 ).

c1 <= c2

c1이 c2보다 작거나 같은지를 판단한다 ( !(c2<c1)와 동일하다 ).

c1 >= c2

c1이 c2보다 크거나 같은지를 판단한다 ( !(c1<c2)와 동일하다 ).


 

■ list의 할당 연산자

동작

효과

c1 = c2

c2의 모든 원소들을 c1에 할당한다

c.assign(n, elem)

elem 원소의 n개의 복사본을 할당한다

c.assign(beg, end)

[beg,end) 범위의 원소를 할당한다

c1.swap(c2)

c1과 c2의 데이터를 교체한다.

swap(c1,c2)

동일하다(전역 함수).


 

■ list의 원소 액세스 관련 동작

동작

효과

c.front()

첫 번째 원소를 반환한다(원소가 있는지 검사하지 않는다)

c.back()

마지막 원소를 반환한다(원소가 있는지 검사하지 않는다)


 

■ list의 반복자 함수

동작

효과

c.begin()

첫 번째 원소를 가리키는 랜덤 액세스 반복자를 반환한다

c.end()

맨 마지막 원소 뒤를 가리키는 랜덤 액세스 반복자를 반환한다

c.rbegin()

역방향에서 첫 번째 원소의 역방향 반복자를 반환한다

c.rend()

역방향에서 마지막 원소 뒤를 가리키는 역방향 반복자를 반환한다


 

■ vector 원소의 삽입 및 제거 동작

동작

효과

c.insert(pos,elem)

반복자 pos위치에 elem의 복사본을 삽입한다

그리고 새로운 원소의 위치를 반환한다

c.insert(pos,n,elem)

elem의 n개의 복사본을 반복자 pos 위치에 삽입한다. 반환값은 없다.

c.insert(pos,beg,end)

[beg,end) 범위의 모든 원소들을 복사하여 반복자 pos 위치에 삽입한다.

반환값은 없다.

c.push_back(elem)

끝부분에 elem의 복사본을 추가한다.

c.pop_back()

마지막 원소를 제거한다(제거된 원소를 반환하지 않는다.)

c.push_front(elem)

앞부분에 elem의 복사본을 추가한다

c.pop_front()

첫 번째 원소를 제거한다(제거된 원소를 반환하지 않는다)

c.remove(val)

값이 val인 모든 원소를 제거한다

c.remove_if(op)

op(elem)가 true를 반환하는 모든 원소를 제거한다

c.erase(pos)

반복자 pos 워치의 원소를 제거한다. 그리고 다음 원소의 위치를 반환한다.

c.erase(beg,end)

[beg,end)범위의 모든 원소들을 제거한다. 그리고 다음 원소의 위치를 반환

c.resize(num)

원소의 개수를 num개로 변경한다

(만약 size()가 증가된다면, 새로운 원소들은 그들의 디폴트 생성자에 의해서 생성된다.)

c.resize(num,elem)

원소의 개수를 num개로 변경한다

(만약 size()가 증가된다면, 새로운 원소는 elem의 복사본이다).

c.clear()

모든 원소들을 제거한다(빈 컨테이너로 만든다).


 

■ list의 원소를 특별하게 수정하는 동작

동작

효과

c.unique()

같은 값을 가지는 연속된 원소들의 중복을 제거한다.

(1,2,3,3,4,3 -> 1,2,3,4,3)

c.unique(op)

op()가 true를 반환하는 연속된 원소들의 중복을 제거한다.

c1.splice(pos,c2)

c2의 모든 원소들을 c1의 pos 위치 앞으로 이동한다

c1.splice(pos,c2,c2pos)

c2의 c2pos에 있는 원소를 c1의 pos 위치 앞으로 이동한다

c1.splice(pos,c2,c2beg,c2end)

c2의 [c2beg, c2end)의 원소들을 c1의 pos 위치 앞으로 이동한다

c.sort()

< 연산자를 정렬 기준으로 정렬한다

c.sort(op)

op()를 정렬 기준으로 정렬한다

c1.merge(c2)

두 컨테이너 모두 정렬되어 있다는 가정하에 c2의 모든 원소들을 c1로 이동한다. 그러므로 모든 원소들은 병합되며 정렬 기준에 어긋나지 않게 정렬되어 있다.

c1.merge(c2,op)

두 컨테이너 모두 op() 정렬 기준에 의해 정렬되어 있다는 가정하에 c2으 lahems 원소들을 c1로 이동한다. 그러므로 모든 원소들은 병합되며, 정렬 기준 op()에 어긋나지 않게 정렬되어 있다.

c.reverse()

모든 원소들의 순서를 뒤바꾼다.


 

■ 예외에 대해서 보장해 주는 동작들

동작

효과

push_back()

성공하거나 아무런 영향도 받지 않는다

push_front()

성공하거나 아무런 영향도 받지 않는다

insert()

성공하거나 아무런 영향도 받지 않는다

pop_back()

예외를 던지지 않는다

pop_front()

예외를 던지지 않는다

erase()

예외를 던지지 않는다

clear()

예외를 던지지 않는다

resize()

성공하거나 아무런 영향도 받지 않는다

remove()

원소를 비교하는 도중 예외를 던지지 않는다면 예외를 던지지 않는다.

remove_if()

조건자가 예외를 던지지 않는다면 예외를 던지지 않는다

unique()

원소를 비교하는 도중 예외를 던지지 않는다면 예외를 던지지 않는다.

splice()

예외를 던지지 않는다

merge()

원소를 비교하는 도중 예외를 던지지 않는다면 예외를 던지지 않는다.

reverse()

예외를 던지지 않는다

swap()

예외를 던지지 않는다

'C++ > STL-list' 카테고리의 다른 글

list-소스한개  (0) 2012.08.13

containers

Posted 2012. 8. 13. 22:14

자료의 집합을 나타내는 클래스 템플릿. 단위 작업에 필요한 시간복잡도에 의해 구분된다.

다른 타입의 데이터를 저장할 수 있게 쉽게 커스터마이징(이용자가 사용방법과 기호에 맞춰 설정하거나 기능을 변경)할 수 있다.

 

알고리즘의 동작을 결정하는 객체. 함수호출 연산자( ()연산자 ) 를 적용할 수 있는 모든 대상이 함수자가 될 수 있다. 일반함수, 혹은 ()연산자를 오버로딩한 클래스의 객체들이 해당된다. greater<>, less<>등등 여러 알고리즘에서 유용하게 사용할 수 있는 템플릿이다.

 

STL :  7가지 basic type이 사용가능할 뿐만 아니라 basic type에서 상속된 3가지 타입이 더 있다그리고 basic type에서 상속 받는 자신만의 콘테이너를 만들수도 있다 

메인 카테고리 : sequence  ,  associative

sequence : vector, list, deque

associative : set, multiset, map, multimap

 

sequence containers

line으로 시각화 할수 있는 요소들의 집합을 저장. 각 요소들은 선을 따라서 다른 요소들과 연결되어 있다.

끝요소를 제외한 각 요소들은 어떤 요소들의 앞에 있을 수 있고 뒤에 있을 수 있다.

 

 associative

키를 이용하여 데이터를 엑세스. 사전과 비슷한 개념. 키오브젝트가 인덱스 역할을 하고 value오브젝트가 인덱스가 가리키는 값이 됨

 

각 컨테이너들을 include

#include <vector>

#include <list>

#include ........................

 

Member Function

size()

empty()

max_size()

begin()

end()

rbegin()

rend()

'C++ > STL' 카테고리의 다른 글

iterateor  (0) 2012.08.13
STL 동적 할당 해제  (0) 2012.08.13
algorithm  (0) 2012.08.13
STL 이란 ?  (0) 2012.08.13

algorithm

Posted 2012. 8. 13. 22:13

container가  가진 데이터를 다양한 방법으로 처리하는 프로시져다

그렇지만 container의 멤버함수는 아니고 템플릿 함수들이다.

 #include <algorithm> 

  1. find(시작주소, 끝주소, 찾을값)

    ->주어진 원소와 같은것으로 판단되는 원소를 검색하는 선형 검색 알고리즘. 기본적으로 == 연산자를 사용

    ->동일한 최초의 값을 리턴

    ex) int arr[5] = {1, 2, 3, 4, 5};

    int* k = find(arr, arr+5, 3);

    cout<<(*k)<<endl;  => 3

    -> 반환값 : 찾는 값의 주소

  2. sort(시작, 끝)

    -> 정렬 알고리즘(지정한 순서로 정렬)

    ex) int arr[5] = {1, 5, 2, 3, 4};

    sort(arr, arr+5);  //1,2,3,4,5 순으로 정렬

  3. make_heap()

    -> 어떤 구간[S,E)를 힙으로 만든다

  4.  count(시작주소, 끝주소, 찾을값)

    -> 엘리먼트의 갯수를 리턴

    -> 반환값 : 찾는 값의 갯수 (갯수만큼 count가 ++됨)

  5.  search(B의시작주소, B의 끝주소, A의시작주소, A의 끝주소)

    -> 어떤 한 container(A)의 연속적은 패턴(값들)을 다른 한 container(B)에서 찾아본다

    -> 반환값 : 최초에 발견된 값들의 B의 시작주소

  6.  equal()

    -> 두 콘테이너의 데이터가 완전히 같으면 true를 리턴

  7.  copy()

    -> 시퀀스 값을 복사

  8. swap()

    -> 값을 서로 바꾼다.

  9. iter_swap()

    -> 시퀀스 값을 서로 바꾼다

  10. fill()

    -> 시퀀스의 특정 위치에 값을 채운다.

  11. max()

    -> 주어진 입력중에서 가장 큰 값을 구한다. 기본 자료형 이외에도 연산자를 오버로딩한 클래스나 구조체를 입력으로 받을 수 있다.

  12. min()

    -> max()와 같지만 최소값을 반환한다

  13. insert()

    -> if( (*iter) == 3)                  //iter가 3과 같으면

    (*iter).insert(iter, 100);    //그 앞에 100을 넣어라.

  14. iter_swap()

    -> 시퀀스 값을 서로 바꾼다.

  15.  merge(src1의 시작주소, src1의 끝주소, src2의 시작주소, src2의 끝주소, dest의 시작주소)

    -> 두개의 저장소를 결합한다.

  16.  accumulate()

    -> 주어진 범위의 값을 더한다.

  17.  for_each(시작, 끝, 각각의element를 함수로 넘겨줌)

    ->각 콘테이너의 엘리먼트 값을 탐색

    ex) void AddNum(int num)

    {

    cout << (num+10) << endl;

    }

    void main()

    {

    int arr[5] = {1, 2, 3, 4, 5};

    for_each(arr, arr+5, AddNum);

    }

    -> +10씩 더해진 값이 나옴

'C++ > STL' 카테고리의 다른 글

iterateor  (0) 2012.08.13
STL 동적 할당 해제  (0) 2012.08.13
containers  (0) 2012.08.13
STL 이란 ?  (0) 2012.08.13

STL 이란 ?

Posted 2012. 8. 13. 22:11

STL :: Standard Template Library

STL :: 표준        템플릿     라이브러리

 

장 점

  1. 자료의 유형(객체 지향 기법과 일반화 프로그래밍 기법)에 상관없이 구현되어 있기 때문에 포괄적이다.

  2. 테스트를 거친 검증된 라이브러리라 버그가없고 개발 기간을 단축할 수 있다.

 

단 점

  1. 디버깅이 힘들다. STL의 근원이 되는 템플릿은 효과적인 디버깅과 정지점 설정이 어렵다.

  2. 메모리 할당이 비효율적이다. 누수같은 버그는 없지만 메모리 단편화 현상을 유발시킨다. 하지만 메모리 단편화 문제는 사용자정의 할당자를 만들어 피할수 있다.

 

 구 성

  1. containers(자료구조)

  2. iterator(반복자)

  3. algorithm(알고리즘)

  4. functional(함수자)

'C++ > STL' 카테고리의 다른 글

iterateor  (0) 2012.08.13
STL 동적 할당 해제  (0) 2012.08.13
containers  (0) 2012.08.13
algorithm  (0) 2012.08.13

Run-Time Type Information

Posted 2012. 8. 13. 22:10

런타임 동안 해당 타입에 대한 정보를 알아보는것

우리가 게임이나 프로그램 실행중에 어떠한 객체의 타입을 알려면 그객체의 고유 ID를 멤버에  넣어서 그 ID를 통해 식별하거나 하는

방법을 사용하는데 RTTI를 사용하면 언제든 클래스 타입이 뭔지 알아낼수 있다.

그리고 다형성 객체의 동적 타입을 알아내기 위해 도입된 기능이다.

 

 

RTTI는 다형성 객체의 동적 타입을 알아내기 위해 만들어진 기능. base* 타입의 포인터가 포인팅 하고있는 객체가 실제로 type1 인지 type2 인지

 

알고자 할 때 쓰이는것.

 

정리하면..;

A라는 클래스의 객체 a만 가지고선 A라는 클래스의 객체인지 알 수 도없고, 어디서 상속받는 클래스의 객체인지  알수도 없다.

이런 경우 객체의 타입을 알아내기 위해서 RTTI를 사용한다.

 

RTTI특성상 객체를 생성 할 때마다 그 객체 내부에 타입 정보와 상속 정보를 넣어둔다. 때문에 속도의 저하가 일어난다.

이펙티브c++책에도 켯을때와 껏을때의 속도 차이가  난다는것을 알려준다.

 

이 안에 있는 장치중에 dynamic_Cast라는 것이 있다

객체가 상위 클래스로 형변황 할때 형변환 안정성을 검사해 주는 연산자.

 

 C형태의 형변환을 사용하여 포인터의 형변환을 사용하면 상속받지 않은 클래스도 형변환이 이루어 진다.

다만 어떤 결과가 나올지는 예상할 수 없는 일이다. 이런경우 dynamic_cast<>를 사용하면 RTTI를 사용해서

타입 확인을 하기 때문에 안전하게 형변환이 가능하다. 다만 dynamic_Cast는 RTTI정보를 사용하기 때문에 속도가 떨어진다.

 

그래서 변형된 형태의 RTTI를 사용한다. 보통 클래스 내부에 객체의 타입을 하나의 변수에 두고 그 변수를 확인 하는 방법이다.

class A

{

public:

A() { type = TYPE_A; }            // type값을 생성자에 넣는다

int GetType(){ return type; }   // 객체의 type를 반환한다

protected:

int type;                                 // 객체의 type를 저장하는 변수

};

 

 class B : public A

{

B() { type = TYPE_B; }      // 상속받은 클래스 마다 자신의 type를 저장한다

}

 

B* b = new B();

switch( b->GetType() )         // 객체의 type를 받아와서 작업한다

{

case TYPE_A:

break;

case TYPE_B:

break;

}

 이와같이 RTTI는 실행 시점에서 객체만을 가지고 그 객체의 타입(클래스)를 알아내서 작업을 하는 경우에 많이 사용된다.

 

explicit

Posted 2012. 8. 13. 22:09

묵시적 타입 변환

특별히 개발자가 명시해 주지 않아도 자동적으로 허용되는 변환

 예를들어 int형 데이터를 double로 변환 할 경우 int 데이터 타입이 표현 할 수 있는 수치의 범위보다 double 데이터 타입이 표현 할 수 있는

수치 범위가 더  크므로 묵시적 타입을 변환해도 상관없다.

 ex)

int a=100;

double b = n;

이런식이 묵시적 변환

 

명시적은

int a = 100;

bouble b = (double)a;

이게 명시적

 

 그럼 여기서..

sample a = sam1;

sample b =(sam1);

이렇게 묵시적 변환이 일어나서 복사 생성자가 호출된다.

 이걸 허용하지 않으려면 명시적으로 바꾸면 된다.

그걸 바꾸는 것이 explicit이다.

 

왜 쓰냐면.

자료형이든 문장이든 자동으로 변환되는 것이 늘 좋은 것만은 아니다. 묵시적 변환이 많이 발생하는 코드일수록  코드의 결과를 예측하기 어려워진다.

따라서 explicit는  코드의 명확함음 더하기 위해 자주 사용되는 키워드중 하나이다.

 

« PREV : 1 : 2 : 3 : NEXT »