- 가장 많이 쓰는 vector, string에 관련된 팁 모음이다. 큰1장 후반부에는 모르는 내용(할당기 같은..)이 좀 많아서 일단 건너 뛰었다.
1. Item13. Prefer vector and string to dynamically allocated arrays. ¶
1.1. new/delete 콤비의 문제점 ¶
- new 해줬으면 delete 해줘야 한다는 번거로움.
- delete [] 와 delete 를 잘 써야 함. 잘못 쓰면 무슨 일이 벌어질지 모름.
- 한번 delete한 메모리를 또 delete하면 "잘못된 연산... " 요 에러가 뜰지도 모름.
1.2. vector/string 을 쓰면 좋은 이유 ¶
- 자신이 알아서 메모리 관리 한다.(캬)
- 자신이 알아서 늘어난다.(역시 캬)
- 배열은 제공하지 않는 연산을 제공한다.
- char*은 짜증난다.
1.3. 나중에 찾아볼것들 ¶
- reference count라는 게 있는데.. 뭐하는 걸까.. 참조 변수 세는건가?--a AfterCheck
- 멀티 쓰레드 환경에서는 다른 쓰레드가 할당해주고 복사해주므로 시간이 절약된다는데.. 굳이 이것까지 쓸것인가..--;
2. Item14. Use reserve to avoid unnecessary reallocations. ¶
2.1. vector/string의 메모리가 필요할때 더 커가는 과정 ¶
- 새로운 메모리를 할당한다.(일반적으로 두배 커진다.)
- 원본 컨테이너의 값들을 새롭게 할당한 메모리로 옮긴다.
- 원본 컨테이너안에 있던 객체들을 삭제한다.
- 원본 컨테이너의 메모리를 해제한다.
2.2. 헷갈릴수 있는 컨테이너 크기에 관한 메소드들 ¶
- size() - 현재 컨테이너에 들어 있는 객체의 수.(최대량 아님)
- capacity() - 현재 할당되어 있는 메모리에 최대 수용할수 있는 객체 수
- resize(n) - n개 넣을수 있게 메모리 재할당
- n이 현재 size()보다 작으면 - 끝에서부터 size() - n 만큼 지운다.
- n이 현재 size()보다 크면 - 끝에서부터 n - size() 만큼의 빈 공간을 추가한다.
- n이 현재 capacity()보다 크면 - 메모리 재할당한다.
- reserve() - 그 컨테이너의 capacity를 최소 n이 되게 할당.
- vector에서 만약 현재 capacity보다 n이 작다면? - 쌩깐다.
- string에서는 ? 줄일지도 모른다.(--;)
2.3. 크기를 유지하고 싶다면 reserve 메소드를 사용하자. ¶
- reserve를 사용하면 재할당, 반복자, 포인터, 참조 등등의 갱신을 최소화 시킬수 있다.
- reserve로 왕창 크게 잡아 놓고 나중에 trim() 써주자. 빈공간 제거된다.
3. Item15. Be aware of variations in string implementations. ¶
4. Item16. Know how to pass vector and string data to legacy APIS ¶
5. Item17. Use 'the swap trick' to trim excess capacity. ¶
6. Item18. Avoid using vector<bool>. ¶