블로그는 나의 힘!
[ Programing ]/STL & Booster2009. 12. 24. 00:37
[List 원하는 위치의 데이터 삭제]


#include <list>
#include <algorithm>

typedef struct {
   word buff;
} TEST;

// 사용자가 새로 정의. 구조체 이면서 함수 처럼 동작.
// 즉, 구조체이나 이터네이터로 동작.
struct CompareList : public std::binary_function < TEST*, char, bool >
{
   bool operator() ( const TEST* pData, const word test ) const
   {
      return pData->buff == test ;  // 같으면 true, 다르면 flase
   }
};

 

// 사용자가 새로 정의. 구조체 이면서 함수 처럼 동작.
// 즉, 구조체이나 이터네이터로 동작.
struct CompareList2
{

   CommpareList2();

   CommpareList2( word param ) { this->param = param; }

   word param;


   bool operator() ( const TEST& hs ) const
   {
      return ( hs.buff == this->param );
   }
}; 



std::list<TEST*> TestList;

////////////////////////////// Data input. //////////////////////////////
TestList.push_back( new TEST );
TestList.push_back( new TEST );
TestList.push_back( new TEST );
TestList.push_back( new TEST );


//////////////////////////// Data output //////////////////////////////
for( std::list<TEST*>::iterator iter = TestList.begin(); iter != TestList.end(); ++iter )
{
     printf( "Test buffer = %s \n", (*iter)->buff );
}

 

word comparevalue = 0;

// find_if 첫번째
///////// find data  처음 ~ 끝까지 검색하며 CompareList() 의 조건으로 comparevalue 를 찾아라 ///////

std::list<Test*>::iterator iter = std::find_if( TestList.begin(), TestList.end(), CompareList(), comparevalue );

 

// find_if 두번째

 std::list<Test*>::iterator iter2 = std::find_if( TestList.begin(), TestList.end(), CompareList2(comparevalue) );

 

// 걍 검사

std::list<TEST*>::iterator iter_ = std::find( TestList.begin(), TestList.end(), comparevalue ); 


// erase func.  해당 위치를 삭제 한다.

if( iter != TestList.end() )
{
   TestList.erase( iter );
}




=============================================================================
- 핵심 :
list.erase( iterator );    
std::binary_function<Test*, char, bool>    
std::find_if( list.begin(), list.end(), CompareList, CompareValue );

 

 

 

Posted by Mister_Q