std::list 는 double linked list 로 구현이 되어 있다
std::vector 은 array
array 의 경우는 탐색, 삽입, 삭제가 모두 O(n) 이고
linked list 는 탐색은 O(n) 이지만 삽입 삭제가 O(1) 이다.
그러면 링크드리스트 쓰는게 훨씬 효율적인 것 아닌가?
탐색의 경우는 같은 O(n) 일지라도, 캐싱 때문에 vector 가 훨씬 낫다.
벡터는 바로 뒤에 데이터들이 연결되어 있기 떄문에 캐싱이 되어 있어 빠르게 접근이 가능하다.
하지만 list 는 연속적인 공간 안에 존재하는 것이 아니라 힙에 띄엄띄엄 저장되어 있어 캐시라인에서 가져올 수 없다.
list 가 삽입과 삭제에서 O(1) 이라는 압도적인 시간복잡도를 보여주긴 한다.
하지만 vector 에서도 O(1) 을 가지게 할 수 있다. push/emplace_back() 으로 넣어서 O(1) 을 받고,
delete 역시 move() 를 써서 해당 위치의 값을 없애는 효과를 보여줄 수 있다
이럴 경우 물론 안의 순서를 보장받지는 않지만, iterator 를 통해서 컨테이너들을 돌아봐야하는 상황에서는
순서가 크게 의미가 없는 경우가 많다.
하지만 이는 실무적인 측면에서의 접근이기에, 알고리즘 등과 같이 정확한 자료구조를 선택할 때에는 충분한 고려가 필요할 것 같다.
'STUDY > C++' 카테고리의 다른 글
[C++] const 포인터와 const 로의 포인터? (0) | 2020.06.29 |
---|---|
[C++] 키워드 static (0) | 2020.05.26 |
[C++] 배열과 벡터? (0) | 2020.05.21 |
[C++] 헤더파일과 소스파일 (0) | 2020.05.17 |
[C++] 벡터 push() vs emplace() (0) | 2020.05.10 |