#includelist 형식은 아래와 같습니다.
list< 자료 type > 변수 이름list를 int 형에 대해 선언했습니다.
list< int > list1;선언 후에는 리스트를 사용하면 됩니다. 물론, 동적 할당도 가능합니다.
list < 자료 type >* 변수 이름 = new list< 자료 type >; list< int >* list2 = new list< int>;
using namespace std;위와 같이 namespace를 선언하지 않고 list를 사용하려면 STL 라이브러리 앞에 namespace를 적어 줘야 합니다.
std::list< int > list;
STL의 컨테이너 < 자료 type >::iterator 변수 이름반복자 사용에 대해서 예를 들어 보겠습니다.
list< int > list1;begin()
예) list< int >::iterator iterFirst = list1.begin();end()
예) list< int >::iterator iterEnd = list1.end();for문에서 list에 저장된 모든 요소에 접근하려면 begin()과 end() 반복자를 사용하면 됩니다.
for( list< int >::iterator iterPos = list1.begin(); iterPos != list1.end(); ++iterPos ) { cout << "list1의 요소 : " << *iterPos << endl; }list< int >::iterator iterPos는 list에 정의된 반복자를 가져오며, list< int >::iterator iterPos = list1.begin();은 list1의 첫 번째 요소를 가리킵니다. iterPos != list1.end();는 반복자가 end()를 가리키면 for 문을 빠져 나오게 합니다. ++iterPos는 반복자를 하나씩 이동 시킵니다.
예) listrend()::reverse_iterator IterPos = list1->rbegin();
예) list반복문에서 rbegin()과 rend()를 사용하여 list1의 각 데이터에 접근한다면 아래처럼 사용하면 됩니다.::reverse_iterator IterPos = list1.rend();
for( list그럼 이제 본격적으로 list의 주요 멤버들의 사용 법에 대해서 설명합니다.::reverse_iterator IterPos = list1.rbegin(); IterPos != list1.rend(); ++IterPos ) { cout << "역 방향 list1의 요소 : " << *IterPos << endl; }
#include결과#include using namespace std; // 아이템 구조체 struct Item { Item( int itemCd, int buyMoney ) { ItemCd = itemCd; BuyMoney = buyMoney; } int ItemCd; // 아이템코드 int BuyMoney; // 판매금액 }; void main() { list< Item > Itemlist; // 앞에 데이터 추가 Item item1( 1, 2000 ); Itemlist.push_front( item1 ); Item item2( 2, 1000 ); Itemlist.push_front( item2 ); // 뒤에 데이터 추가 Item item3( 3, 3000 ); Itemlist.push_back( item3 ); Item item4( 4, 4500 ); Itemlist.push_back( item4 ); // 아이템 코드 번호가 2, 1, 3, 4의 순서로 출력된다. list< Item >::iterator iterEnd = Itemlist.end(); for(list< Item >::iterator iterPos = Itemlist.begin(); iterPos != iterEnd; ++iterPos ) { cout << "아이템 코드 : " << iterPos->ItemCd << endl; } // 앞에 있는 데이터를 삭제한다. Itemlist.pop_front(); // 앞에 있는 데이터의 참조를 반환한다. Item front_item = Itemlist.front(); // 아이템 코드 1이 출력된다. cout << "아이템 코드 : " << front_item.ItemCd << endl; // 마지막에 있는 데이터를 삭제한다. Itemlist.pop_back(); // 마지막에 있는 데이터의 참조를 반환한다. Item back_item = Itemlist.back(); // 아이템 코드 3이 출력된다. cout << "아이템 코드 : " << back_item.ItemCd << endl; // 저장된 데이터가 있는가? if( false == Itemlist.empty() ) { list< Item >::size_type Count = Itemlist.size(); cout << "남아 있는 아이템 개수: " << Count << endl; } // 모든 데이터를 지운다. Itemlist.clear(); list< Item >::size_type Count = Itemlist.size(); cout << "남아 있는 아이템 개수: " << Count << endl; }
원형 : iterator insert( iterator _Where, const Type& _Val ); void insert( iterator _Where, size_type _Count, const Type& _Val ); templatevoid insert( iterator _Where, InputIterator _First, InputIterator _Last );
list< int >::iterator iterInsertPos = list1.begin(); list1.insert( iterInsertPos, 100 );이 코드는 100을 첫 번째 위치에 삽입합니다.
iterInsertPos = list1.begin(); ++iterInsertPos; list1.insert( iterInsertPos, 2, 200 );list1의 두 번째 위치에 200을 두 번 추가합니다.
list< int > list2; list2.push_back( 1000 ); list2.push_back( 2000 ); list2.push_back( 3000 ); iterInsertPos = list1.begin(); list1.insert( ++iterInsertPos, list2.begin(), list2.end() );list1의 두 번째 위치에 list2의 모든 요소를 삽입합니다.
#include결과#include using namespace std; void main() { list< int > list1; list1.push_back(20); list1.push_back(30); cout << "삽입 테스트 1" << endl; // 첫 번째 위치에 삽입한다. list< int >::iterator iterInsertPos = list1.begin(); list1.insert( iterInsertPos, 100 ); // 100, 20, 30 순으로 출력된다. list< int >::iterator iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "삽입 테스트 2" << endl; // 두 번째 위치에 200을 2개 삽입한다. iterInsertPos = list1.begin(); ++iterInsertPos; list1.insert( iterInsertPos, 2, 200 ); // 100, 200, 200, 20, 30 순으로출력된다. iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "삽입 테스트 3" << endl; list< int > list2; list2.push_back( 1000 ); list2.push_back( 2000 ); list2.push_back( 3000 ); // 두 번째 위치에 list2의 모든 데이터를 삽입한다. iterInsertPos = list1.begin(); list1.insert( ++iterInsertPos, list2.begin(), list2.end() ); // 100, 1000, 2000, 3000, 200, 200, 20, 30 순으로출력된다. iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } }
원형 : iterator erase( iterator _Where ); iterator erase( iterator _First, iterator _Last );
list1.erase( list1.begin() );두 번째 erase는 지정한 반복자 요소만큼 삭제합니다. 다음 코드는 list1의 두 번째 요소에서 마지막까지 모두 삭제합니다.
list< int >::iterator iterPos = list1.begin(); ++iterPos; list1.erase( iterPos, list1.end() );아래는 erase의 두 가지 사용 방법을 보여주는 전체 코드입니다.
void main() { list< int > list1; list1.push_back(10); list1.push_back(20); list1.push_back(30); list1.push_back(40); list1.push_back(50); cout << "erase 테스트 1" << endl; // 첫 번째 데이터 삭제 list1.erase( list1.begin() ); // 20, 30, 40, 50 출력 list< int >::iterator iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "erase 테스트2" << endl; // 두 번째 데이터에서 마지막까지 삭제한다. list< int >::iterator iterPos = list1.begin(); ++iterPos; list1.erase( iterPos, list1.end() ); // 20 출력 iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } }결과
iterPos = vector.begin() + 3;
#includeremove#include using namespace std; void main() { list< int > list1; list1.push_back(10); list1.push_back(20); list1.push_back(30); list1.push_back(40); list1.push_back(50); list< int >::iterator iterPos = list1.begin(); while( iterPos != list1.end() ) { // 3으로 나누어지는 것은 제거한다. if( 0 == (*iterPos % 3) ) { // 삭제 되는 것의 다음 반복자를 저장하고 또 이동하지 않게 한다. iterPos = list1.erase( iterPos ); continue; } cout << "list1 : " << *iterPos << endl; ++iterPos; } }
원형 : void remove( const Type& _Val );list1에 담겨 있는 요소 중 특정 값과 일치하는 것을 모두 삭제하고 싶을 때는 아래와 같이 합니다.
// 20을 삭제한다. list1.remove( 20 );위에서는 값 삭제를 했지만 list가 구조체(클래스)의 포인터를 담고 있다면 삭제를 원하는 구조체의 포인터를 통해서 삭제가 가능합니다. 아래는 pitem2 구조체의 포인터를 삭제합니다.
// Item 포인터를 담아야한다. list< Item* > Itemlist; Item* pitem1 = new Item( 10, 100 ); Itemlist.push_back( pitem1 ); Item* pitem2 = new Item( 20, 200 ); Itemlist.push_back( pitem2 ); Item* pitem3 = new Item( 30, 300 ); Itemlist.push_back( pitem3 ); // pitem2를 삭제한다. Itemlist.remove( pitem2 );remove의 사용법에 대한 전체 코드입니다.
#include결과#include using namespace std; // 아이템 구조체 struct Item { Item( int itemCd, int buyMoney ) { ItemCd = itemCd; BuyMoney = buyMoney; } int ItemCd; // 아이템 코드 int BuyMoney; // 판매 금액 }; void main() { list< int > list1; list1.push_back(10); list1.push_back(20); list1.push_back(20); list1.push_back(30); list< int >::iterator iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "remove 테스트 1" << endl; // 20을 삭제한다. list1.remove( 20 ); iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "remove 테스트 2 - 구조체를 삭제" << endl; // Item 포인터를 담아야한다. list< Item* > Itemlist; Item* pitem1 = new Item( 10, 100 ); Itemlist.push_back( pitem1 ); Item* pitem2 = new Item( 20, 200 ); Itemlist.push_back( pitem2 ); Item* pitem3 = new Item( 30, 300 ); Itemlist.push_back( pitem3 ); // pitem2를 삭제한다. Itemlist.remove( pitem2 ); list< Item* >::iterator iterEnd2 = Itemlist.end(); for(list< Item* >::iterator iterPos = Itemlist.begin(); iterPos != iterEnd2; ++iterPos ) { cout << "Itemlist : " << (*iterPos)->ItemCd << endl; } }
원형 : templateremove_if에 사용할 함수 객체를 먼저 선언합니다.void remove_if( Predicate _Pred );
// 20 이상 30 미만이면 true templatelist에서 remove_if에 함수 객체를 사용하여 list의 요소를 삭제하는 방법입니다.class Is_Over20_Under30 : public std::unary_function { public: bool operator( ) ( T& val ) { return ( val >= 20 && val < 30 ); } };
list< int > list1; list1.push_back(10); list1.push_back(20); list1.push_back(25); list1.push_back(30); list1.push_back(34); // 20 이상 30 미만은 삭제한다. list1.remove_if( Is_Over20_Under30< int >() );list1의 요소 중 20 이상 30 미만은 모두 삭제합니다.
#include결과#include using namespace std; // 20 이상 30 미만이면 true template
class Is_Over20_Under30 : public std::unary_function { public: bool operator( ) ( T& val ) { return ( val >= 20 && val < 30 ); } }; void main() { list< int > list1; list1.push_back(10); list1.push_back(20); list1.push_back(25); list1.push_back(30); list1.push_back(34); // 20 이상 30 미만은 삭제한다. list1.remove_if( Is_Over20_Under30< int >() ); list< int >::iterator iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } }
원형 : templatesort 멤버를 사용하면 list1에 있는 요소들이 올림차순으로 정렬합니다.void sort( Traits _Comp );
// 올림 차순으로 정렬한다. list1.sort();내림차순으로 정렬한다면 greater
list1.sort( greater< int >() );greater< int >는 greater< T > 라는 이미 정의되어 있는 함수 객체를 사용한 것입니다.
// 함수 객체 정의 template정의가 끝나면 아래와 같이 사용하면 됩니다.struct COMPARE_ITEM { bool operator()( const T l, const T r ) const { // 정렬 시에는 올림 차순으로된다. 내림 차순으로 하고 싶으면 < 에서 > 로 // 변경하면 된다. return l.ItemCd < r.ItemCd; } };
Itemlist.sort( COMPARE_ITEM< Item >() );Itemlist가 담고 있는 Item은 ItemCd를 기준으로 올림 차순으로 정렬한다.
#include결과#include using namespace std; // 함수 객체 정의 template
struct COMPARE_ITEM { bool operator()( const T l, const T r ) const { // 정렬 시에는 올림 차순으로된다. 내림 차순으로 하고 싶으면 < 에서 > 로 // 변경하면 된다. return l.ItemCd < r.ItemCd; } }; void main() { list< int > list1; list1.push_back(20); list1.push_back(10); list1.push_back(35); list1.push_back(15); list1.push_back(12); cout << "sort 올림차순" << endl; // 올림 차순으로 정렬한다. list1.sort(); list< int >::iterator iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "sort 내림차순" << endl; // 내림 차순으로 정렬한다. list1.sort( greater< int >() ); iterEnd = list1.end(); for(list< int >::iterator iterPos = list1.begin(); iterPos != iterEnd; ++iterPos ) { cout << "list 1 : " << *iterPos << endl; } cout << endl << "sort - 유저가 정의한 방식으로 정렬" << endl; list< Item > Itemlist; Item item1( 20, 100 ); Itemlist.push_back( item1 ); Item item2( 10, 200 ); Itemlist.push_back( item2 ); Item item3( 7, 300 ); Itemlist.push_back( item3 ); // 정렬한다. Itemlist.sort( COMPARE_ITEM< Item >() ); list< Item >::iterator iterEnd2 = Itemlist.end(); for(list< Item >::iterator iterPos = Itemlist.begin(); iterPos != iterEnd2; ++iterPos ) { cout << "Itemlist : " << iterPos->ItemCd << endl; } }
#include결과#include using namespace std; template
class Stack { public: Stack() { Clear(); } // 저장 방식을 설정한다. void SetInOutType( bool bLIFO ) { m_bLIFO = bLIFO; } // 초기화 한다. void Clear() { if( false == m_Datas.empty() ) m_Datas.clear(); } // 스택에 저장된 개수 int Count() { return static_cast ( m_Datas.size() ); } // 저장된 데이터가 없는가? bool IsEmpty() { return m_Datas.empty(); } // 데이터를 저장한다. void push( T data ) { m_Datas.push_back( data ); } // 스택에서 빼낸다. bool pop( T* data ) { if( IsEmpty() ) { return false; } if( m_bLIFO ) { memcpy( data, &m_Datas.back(), sizeof(T) ); m_Datas.pop_back(); } else { memcpy( data, &m_Datas.front(), sizeof(T) ); m_Datas.pop_front(); } return true; } private: list m_Datas; bool m_bLIFO; // true 이면 후입선출, false 이면 선입선출 }; void main() { Stack< int > Int_Stack; // LIFO로 설정 Int_Stack.SetInOutType( true ); Int_Stack.push( 10 ); Int_Stack.push( 20 ); Int_Stack.push( 30 ); int Value = 0; Int_Stack.pop( &Value ); cout << "LIFO pop : " << Value << endl << endl; Int_Stack.Clear(); // FIFO로 설정 Int_Stack.SetInOutType( false ); Int_Stack.push( 10 ); Int_Stack.push( 20 ); Int_Stack.push( 30 ); Int_Stack.pop( &Value ); cout << "FIFO pop : " << Value << endl << endl; }
이전 글 : Flex 개발자를 위한 자동화된 테스팅 매뉴얼 : Part 2
다음 글 : OS X가 Windows보다 안전한가?
최신 콘텐츠