본문 바로가기

자료구조 및 알고리즘

(STL) set


http://blog.naver.com/yoina5173/150003217081 에서 친절하게 설명되어 있다.
여기서는 MSDN( ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vcstdlib/html/43cb1ab2-6383-48cf-8bdc-2b96d7203596.htm ) 을 참고해 insert멤버 사용법을 정리한다.

[NOTE] insert멤버함수에서 iterator 를 인자로 받는 것은, 정렬 시 배치될 위치가 아니라 삽입 전에 첫번째로 비교될 원소위치를 지정하는 것이다. 만약 실제로 배치될 위치의 바로 앞 위치를 주면 빠르게 삽입할 수 있게 한다. 여기 위치의 앞 뒤를 논하는 것은 set의 원소를 크기 순으로 나열했을 때를 말하는 것이다. 기본적으로 set은 크기 비교를 했을 때 작은 것부터 큰 것 순으로 접근하도록 iterator를 제공한다. 물론 여기서 크기 비교는 set을 선언했을 때 제공했거나 기본적으로 원소 타입에 내장된 'less than' operator를 말한다. set 에서 원소가 같은지 여부를 판별하는 것은 a<b 가 거짓이면서  b<a 또한 거짓인 걸 이용하는 듯하다. set을 선언했을 때 less than operator를 잘못 제공하면 안된다!



// set_insert.cpp
// compile with: /EHsc
#include 
#include 

int main( )
{
   using namespace std;
   set ::iterator s1_pIter, s2_pIter;

   set  > s1, s2;
   s1.insert( 10 );
   s1.insert( 20 );
   s1.insert( 30 );
   s1.insert( 40 );

   cout << "The original s1 =";
   for ( s1_pIter = s1.begin( ); s1_pIter != s1.end( ); s1_pIter++ )
      cout << " " << *s1_pIter;
   cout << "." << endl;

   pair< set::iterator, bool > pr;
   pr = s1.insert( 10 );

   if(pr.second == true)   
   {
      cout << "The element 10 was inserted in s1 successfully."
           << endl;
   }
   else   
   {
      cout << "The element 10 already exists in s1 and"
           << " *( pr.first ) = " << *( pr.first ) << "." << endl;
   }

   s1.insert( --s1.end( ), 50 );

   cout << "After the insertions, s1 =";
   for ( s1_pIter = s1.begin( ); s1_pIter != s1.end( ); s1_pIter++ )
      cout << " " << *s1_pIter;
   cout << "." << endl;

   s2.insert( 100 );
   s2.insert( ++s1.begin( ), --s1.end( ) );

   cout << "s2 =";
   for ( s2_pIter = s2.begin( ); s2_pIter != s2.end( ); s2_pIter++ )
      cout << " " << *s2_pIter;
   cout << "." << endl;
}

결과:

The original s1 = 10 20 30 40.
The element 10 already exists in s1 and *( pr.first ) = 10.
After the insertions, s1 = 10 20 30 40 50.
s2 = 20 30 40 100.