2008.07.19 17:57 책 정리/Effective STL
항목 21과 같은 맹락으로 이어진다.

이것 또한 연관 컨테이너(Associative Containers)의 연관을 무너뜨리게 한다. map 과 multimap 도 키를 바꿀수는 있을 꺼 같지만, 여기선 const 이기 때문에 변경을 못하도록 되어 있다.(캐스팅 하면 가능하지만...) 그래서 이 두개의 컨테이너는 삭제 후 삽입 방법으로 변경해야 한다.

하지만 set 이나 multiset 은 값 자체가 키(Key)이기 때문에, 바꾸는 일은 피해야 한다는 것이다. 이것도 키를 바꾸기 위해선 "삭제 후 삽입"을 해야만 한다.


곰곰히 생각하면 난 바꾸지 않을테니까, const 로 Key를 설정할꺼야. 라고 해서 std::set<const set> 하게 해도 크게 두가지 이유 때문에 무의미하게 된다.
첫째, 사용자 정의 객체를 담을 경우 ... 무엇인가 바꾸거야 하는데 전혀 못 바꾸기 때문에
둘째, const로 키로 쓴다 해도, iterator 로 반환되는것이 const reference 가 아닌 reference로 캐스팅 되기 때문에

(보충) 둘째는 STL 마다 차이는 있지만 MSVC2005 에선 reference로 캐스팅 된다.(다른 컴파일러는 const로 된다 하더라도, 첫째 이유 때문에 역시 무의미하게 된다)
이 말을 못믿는가? 코드를 포함 한다.


보면 나와 있듯이 엉키게 된다. 아.. OTL 간단한건 const로 넣어도 되게 해줘야 하는게 아닌가? 란 생각을 해봤지만, 코드 이식성 때문에 이렇게 한듯하다. (대체적으로 반환값을 reference를 반환하는 컴파일러가 많으니...)


책에 없는 예제이기에 한번 만들어 본 것이고.. 책에 있는 내용중에 연관 컨테이너에 삭제후 삽입할 때 성능 좋은 넣기가 있지만, 요점은 이게 아니라서 뺐다.(힌트는 .. 후위연산자를 사용해서... ㅋㅋ)


관련링크

http://blog.empas.com/electr/read.html?a=18722526
http://ilu8318.egloos.com/785371

신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. Favicon of http://ikpil.tistory.com 게임 프로그래머라 불릴 최익필 2008.07.19 17:59 신고  Addr  Edit/Del  Reply

    점점 정리해가는게, 실험을 포함하게 되어간다. 뭐 어찌 되었던 .. 3분의 1 본건가.