stl의 find와 sort를 사용하기란 함수 객체를 모르는 상태에서는 조금 어렵습니다.

함수 객체는 말 그대로 "함수이면서 객체" 입니다.

함수이면서 객체인 것은 어떤 것이 있을까요? 아래 코드를 보면 쉽게 알 수 있습니다.

(참조: http://www.hanb.co.kr/network/view.html?bi_id=1626 )

 

 

구조체 안에 함수를 담으면 함수 객체이냐고?? 일단은 그렇게 생각하세요. 그게 쉽습니다.

 

자 이제 그럼 stl::find()와 stl::sort()를 사용해 보도록 하겠습니다. 사용법은 위 함수객체만 안다면 너무나 쉽습니다.

아, 한가지 덧 붙이자면 find는 정수 같은 것은 바로 찾을 수 있지만 "사용자 정의 데이터 타입"은 find를 할 수 없습니다. 그래서 우리는 find_if함수를 사용해야 합니다. find_if 함수는 우리가 만든 데이터도 찾게 해줍니다.

 

소트 수행 전

 

소트 수행 후

 

 

100번 말보다는 한번 보는게 낫겠죠. 한번 보시고 돌려 보세요. 쉽게 아실 수 있을 겁니다.

 

결과입니다. 열공하세요!!


Bloger : moltak.net

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

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18

Algorithm

#include <algorithm>

sort( b, e ) // 범위 [b, e]에 의해 정의되는 요소들을 재 정렬시킨다.

max( b, e ) // b와 e중 더 큰 값을 리턴시킨다.

min( b, e ) // b와 e중 더 작은은 값을 리턴시킨다.

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

STL find()와 sort() 사용하기  (0) 2010.07.27
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18

list


#include <list>


list<Student_info> extract_failslist<Student_info>& students )

{

list<Student_info> fail;

list<Student_info>::iterator iter = students.begin();


         while( iter != students.end() )

{

if( fgrade( *iter) )

{

fail.push_back( *iter );

iter = students.erase( iter );

}

      else

++iter;

}


return fail;

}


list sort 함수

list<Student_info> students;

students.sort( compare );


list<int> l;

l.sort(), l.sort( cmp ) // list 의 타입에 대한 < 연산자를 사용하거나, cmp 함수를 사용하여 l의 요소들을 정렬합니다.



// 반복자 미 사용

forlist<Student_info>::size_type i = 0; i != students.size(); ++i )

cout << students[ i ].name << endl;


// 반복자 iterator 사용

forlist<Student_info>::const_iterator iter = students.begin(); iter != students.end(); ++iter )

cout << iter->name << endl;


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

STL find()와 sort() 사용하기  (0) 2010.07.27
Algorithm  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18

모든 순차 컨테이너들과 string 타입은 다음과 같은 연산들을 제공한다.


container<T>::iterator

container<T>::const_iterator // 이 컨테이너에 대한 반복자의 타입명

container<T>::size_type // 이 컨테이너의 인스턴스가 가질 수 있는 최대 사이즈 갑을 저장할 수 있는 타입의 이름

c.begin()

c.end() // 컨테이너의 첫 번째 및 마지막 요소를 가리키는 반복자

c.rbegin()

c.rend() // 컨테이너의 요소를 역순으로 접근할 수 있도록 컨테이너의 마지막 및 (하나 이전의) 첫 번째 요소를 가리키는 반복자

container<T> c();

container<T> c( c2 ); // 빈 컨테이너로서의 c를 정의하거나, 만약 주어진다면, c2의 복사본으로서의 c를 정의합니다.

container<T> c( n ); // T의 타입에 따라 값지정-초기화된 n개의 요소들을 갖는 컨테이너로서의 c를 정의합니다. 만약 T가 클래스 타입이라면, 이 클래스 타입에 따라 요소들이 어떻게 초기화될 것인지가 결정됩니다. 만약 T가 내장된 연산 타입이라면, 요소들은 0으로 초기화 됩니다.


container<T> c( n, t ); // t의 복사본인 n 개의 요소들을 갖는 컨테이너로서의 c를 정의합니다.

container<T> c( b, e ); // b, e 범위의 반복자로 얻어진 요소들의 복사본을 담는 컨테이너를 생성합니다.

c = c2 // 컨테이너 c의 내용을 컨테이너 c2의 복사본으로 변경합니다.

c.size() c의 요소들의 개수를 size_type 으로 리턴합니다.

c.empty() c에 요소가 하나도 없는지 알려주는 함수

c.insert( d, b, e ) // b, e 범위의 반복자가 가리키는 요소들을 복사해서 d 바로 앞에 삽입시킨다.

c.erase( iterator )

c.erase( b, e ) // 컨테이너 c로부터 iterator가 기리키는 요소, 또는 (b, e ) 가 나타내는 범위의 요소들을 삭제한다. 이 연산은 list에 대해서는 빠르지만, vector 및 string에 대해서는 느릴 수 있습니다. 왜냐하면, 이러한 타입에 대해서는 삭제된 요소 다음에 있는 모든 요소들을 복사하는 작업이 필요하기 때문입니다. list에 대해서는 삭제된 요소에 대한 반복자들만 무효화되지만, vector와 string에 대해서는 삭제된 요소의 다음에 위치한 요소들을 가리키는 모든 반복자들이 무효화 됩니다.

c.push_back(t) // c의 끝을 가리키는 요소에 값 t를 추가합니다.


임의 접근을 지원하는 컨테이너들과 string 타입은 다음의 기능을 제공합니다. 

c[n] // 컨테이너 c로부터 n의 위치에 있는 문자를 얻습니다.



반복자 연산

*it // 반복자 iterator를 역참조하여 iterator가 가리키는 위치에 저장된 값을 얻습니다. 이 연산은 보통 it->x 로 사용이됩니다.

++it, it++ 반복자를 증가시켜 컨테이너의 다음 요소를 가리키게 합니다.

b == e, b != e // 두 반복자가 동일한지, 동일하지 않은지 비교합니다.


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

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18
Vector  (0) 2010.03.18

logic_error

domain_error

invalid_argument

length_error

out_of_range

runtime_error

range_error

overflow_error

underflow_error


e.what() 오류를 발생시킨 것이 무엇인지를 설명하는 값을 리턴합니다. 

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

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
String  (0) 2010.03.18
Vector  (0) 2010.03.18

String

#include <string>

s1 < s2 string 인 s1과 s2를 사전 검색 순서로 비교합니다.

s.width( n ) 다음 번 출력에서( n이 생력되면 변화 없음), 스트림 s의 넓이를 n으로 설정합니다. 출력의 오른쪽에 주어진 넓이만큼의 공백이 덧붙여집니다. 이전 넓이를 리턴합니다. 표준 출력 연산자는 기존의 넓이 값을 사용하며, width(0)를 사용하면 넓이를 리셋시킵니다.


s.substr( i, j ) // ( i ~ i + j ) 범위의 인덱스에 해당하는 s의 문자들을 복사하여 새로운 string을 생성합니다.

getline( is, s ) // is로부터 한 라인의 입력을 받아들여 s에 저장합니다.

s += s2 // s를 s + s2의 값으로 변경합니다.


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

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
Vector  (0) 2010.03.18

Vector

#include <vector>

// 벡터는 임의 접근에 대해 최적화되어 있다. 최적화의 대가로, 벡터의 끝이 아닌 다른 위치에 요소를 삽입하고 삭제하는 작업은 매우 느리다.

vector<int> vec_int; // int 형의 빈 vector 생성

vec_int.begin() // vec_int의 첫 번째 요소를 나타내는 값을 리턴
vec_int.end() // vec_int의 마지막 요소를 나타내는 값을 리턴

vec_int.push_back( e ) // vector에 e로 초기화된 요소 하나를 추가

vec_int[ i ] // i 위치에 저장된 값을 리턴

vec_int.size() // vec_int 에 들어있는 요소들의 개수를 리턴

vec_int.erase( vec_int.begin() + i ) // 시작위치부터 i번째 떨어져 있는 값을 지움


반복자

  • 컨테이너와 컨테이너 안에 있는 요소를 구별시킵니다.
  • 그 요소의 값을 확인할 수 있습니다.
  • 컨테이너 안에 있는 요소들 간에 이동을 할 수 있는 연산을 제공합니다.
  • 컨테이너가 효과적으로 처리할 수 있는 방식으로 가용한 연산들을 한정시킵니다.


// 반복자 미 사용

forvector<Student_info>::size_type i = 0; i != students.size(); ++i )

cout << students[ i ].name << endl;


// 반복자 iterator 사용

forvector<Student_info>::const_iterator iter = students.begin(); iter != students.end(); ++iter )

cout << ( iter->name << endl;


v.reserve( n ) // n 개의 요소를 담을 수 있는 공간을 확보합니다. 하지만, 초기화하지 않습니다. 이 연산은 컨테이너의 크기를 변화시키지는 않습니다. 단지 반복적인 insert나 push_back으로 인한 빈번한 메모리 할당을 막기 위해서 사용합니다.

v.resize( n ) // v의 사이즈를 n이 되도록 만듭니다. 만약 n이 현재 v의 사이즈보다 작다면, n 이하의 요소들은 vector에서 제거됩니다. 만약 n이 현재 사이즈보다 크다면, 새로운 요소들이 v에 추가되고 v의 타입에 의해 적당한 값으로 초기화 됩니다.

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

Algorithm  (0) 2010.03.18
list  (0) 2010.03.18
Sequential Container  (0) 2010.03.18
stl C++ Exception Class  (0) 2010.03.18
String  (0) 2010.03.18

+ Recent posts