본문 바로가기

(비정기) Dlbo's Post

Generic Algorithm with C++, 06 - Template Set -_-....

크흑. set은 그나마 자료가 좀 적네요. -_-;

-----------------------------------------------------------------------------------------------

set은 쉬운 말로 해서 '집합' 이라 부릅니다.

참 재미있는 녀석인데요...

고등학교 수학 1학년 과정(중학수학에도 있었나는 가물가물해서 기억 잘 안납니다.
군입대가 코앞인데 ㅡ,.ㅡ....;;)

에서 존재하는 집합녀석.

집합인 set에는 동일한 원소가 여러개 존재할 수 없습니다.

동시에, 쓰기 편하라고 알아서 작은 값부터 정렬해둡니다-_-

반복자 이터레이터가 존재하며, 삽입과 삭제가 간편하고,

미리 정렬을 해 두는데다가, 정렬메소드가 없기 때문에 내부 값을 마음대로 바꿔버리면

참 곤란한 상황을 맞이하게 된답니다. ㅡ.,ㅡ;;;



한번에 통채로 만나는 예제~ -_-;

첫번째 예시는 삽입인 insert 메소드입니다.


단순히 저렇게 값만 넣어버릴 수도 있구요.

insert메소드의 리턴은 pair라는 구조체로... 반복자 iterator와 bool형 성공여부를 리턴합니다.

pair<set<int>::iterator, bool>형 구조체 변수를 선언해서 리턴을 받으면 성공인지 실패인지를

확인할 수 있지요.

만약 같은 값이 존재해 삽입이 거부된다면 실패합니다.

두번째는 erase 메소드.


간단합니다.

ㅡ.,ㅡ

그냥 지워요 ㅡ.,ㅡ;;;

집합은 같은 원소가 존재할 수 없기 때문에 한번에 한개의 원소만 삭제되게 됩니다.

이 erase메소드는 리턴으로 타입의 사이즈를 내뱉습니다만... 쓸모 없구요. ㅡ.,ㅡ;;

shit.erase(sit1, sit2);

꼴로 사용할 경우, sit1부터 sit2까지(둘다 반복자입니다.) 싸그리 날려버립니다.

그 다음은 배열을 이용한 초기화.

배열의 일부분을 사용해 그냥 초기화 시켜버릴 수 있습니다.

혹은 타 STL(리스트나 string클래스등 여러가지...)의 반복자를 이용해 초기화하는 법도 있지요.

바로 아래는 원소에 접근하는법.

간단하지요?

연결리스트와 완전히 동일합니다.

ㅡ,.ㅡ;;

그 다음은 원소가 존재하는지 보는 법.

find 메소드는 원소의 존재여부를 확인합니다.

end()메소드를 통해 얻는 반복자는 널포인터.

고로 end()메소드와 동일한 것이 리턴되었다면 탐색에 실패했다는 의미입니다.

반면 일반 반복자가 리턴되었다면 해당 값이 존재함을 의미하게 되는 것이고,

이도 연결리스트처럼 포인터를 이용해 바로 값을 얻을 수 있습니다 ㅡ.,ㅡ;;

-------------------------------------------------------------------------------------------

으흠...

제네릭 알고리즘은 쉽게 생각하면 지나치게 쉽고,

어렵게 생각하면 지나치게 어렵기 때문에;;

이렇게 간단하게 정리하면 거저먹는 느낌이 들어서 찝찝하군요 ㅡ.,ㅡ;;