|
아담 님이 쓰신 글 :
: TList는 레코드수가 많을경우 속도가 떨어지고 map은 중간에 데이터 삽입삭제가 안되고,
:
: STL의 list도 속도가 느리다 하고 직접만든 Linked List를 이용할수밖에 업나요?
:
: 좋은 list있으면 소개시켜주십시요...
:
: 잘데리고 놀겠습니다.
그냥 써봤더니 이랬더라는 체감에 의한 방법보다는
실제로 속도 체크 실험을 해보시는 게 좋을 듯 합니다.
map은 연관 컨테이너이므로 list와는 용도가 전혀 다릅니다. 순서의 개념이 없죠.
참고로, 빌더6에 기본 포함된 STLport에는 slist라는 컨테이너가 있습니다.
ANSI표준의 list는 이중 연결 리스트(doubly linked list)이고,
SGI STL의 slist는 단일 연결 리스트(singly linked list)이므로 메모리도 약간 작게 차지하고, 포인터 연산 오버헤드도 작지요. 이것도 테스트해보시길...
단, 단일 연결 리스트는 한쪽 방향으로만 순회할 수 있기 때문에,
insert와 erase는 상수가 아니라 O(N)이 걸립니다.
그대신 insert_after와 erase_after를 제공합니다.
list보다는 확실히 빠르겠지만 사용은 불편하지요.
그리고 STLport를 비롯한 대부분의 STL 배포판에서,
list와 slist의 멤버함수인 size()의 동작시간은 O(N)임을 주의하시기 바랍니다.
이것은 splice() 함수의 기능과 trade-off 관계가 있기 때문에 그렇습니다.
splice()를 O(1)로 만들기 위해 어쩔 수 없이 size()가 O(N)이 되었습니다.
절대로 list::size()의 결과를 0과 비교하는 코드를 쓰지마시고, 대신 list::empty()를 쓰세요.
그리고 중간에 데이터 삽입/삭제가 생기는 경우가 적고, 랜덤 액세스가 자주 필요할 경우에는
vector나 deque을 쓰시기 바랍니다.
|