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.
'자료구조 및 알고리즘' 카테고리의 다른 글
(C++)Iterator (0) | 2009.10.26 |
---|---|
임의의 시퀀스를 만들 때. (0) | 2009.10.12 |
GA design feedback (0) | 2009.10.06 |
UVA 로봇 심사위원에게 Accepted 사인 받기 위한 점검. (0) | 2009.07.10 |
(STL)map과 hash_map의 차이 (0) | 2009.03.29 |