STL 기능의 대부분은 컨테이너와 관련되어있고 근본이라고 말할수도있다 컨테이너는 객체를 일정한 방식으로 저장하는 조직화하는 개체를 말한다. 컨테이너를 사용한다는 건 데이터에 접근하기 위해 반드시 반복자를 사용한다는 것이므로 반복자도 이해해야 한다.
컨테이너는 순차 컨테이너, 연관 컨테이너, 컨테이너 어뎁터로 나뉘어져있다.
- 순차 컨테이너는 객체를 션형으로 저장하지만 반드시 연속된 메모리로 저장될 필요가없다.멤버함수를 호출하거나 반복자를 사용해서 객체들을 차례로 접근할 수 있다. 또한, 때에 따라서는 첨자 연산자와 인덱스를 사용해서 접근할수도 있다
- 연관 컨테이너는 객체들을 연관된 키와 함께 저장한다. 그 키를 이용해서 객체를 가져온다. 반복자를 사용해서도 가능하다
- 컨테이너 어댑터는 순차 컨테이너나 연관 컨테이너에 저장된 데이터에 접근하는 다른 방법을 제공하는 어댑터 클래스 템플릿이다.
객체들이 이동 시멘틱을 갖는 타입이 아니면 모든 STL컨테이너에 객체의 복제본을 저장한다. 그리고 STL에서는 이동생성자,이동할당연산은 noexcept(예외 던지지않음)로 지정되야한다.
이동시맨틱이 없는 타입의 객체를 컨테이너에 추가하고 수정하면 원본과 컨테이너의 객체는 서로 다른값을 가지게 되니 객체를 가져올때는 컨테이너에서 객체에 대한 참조를 가져오면 저장된 객체를 수정할수있다.
컨테이너에 저장된 객체의 본제본은 객체타입의 복제생성자를 사용해서 생성객체에 대한 포인터를 저장하거나 이동시맨틱을 이용하면 방법이 첫번째 방법보다 좋다
컨테이너 객체들은 힙에 저장되며 메모리도 할당자(allocator)가 자동으로 관리한다. 할당자 직접 구현하면 성능이 더욱 좋아진다. 그렇게 안아도 성능은 좋다.
T객체를 컨테이너에 저장하려면 조건이있다
class T
{
public:
T(); //기본 생성자
T(const T& t); //복제 생성자
~T(); //소멸자
T& operator=(const T& t); //할당 연산자
};
operator<() 를 적용하지 않은 객체는 map나set을 이용할수없으며 보다작은(<)을 지원하지 않는 원소들을 담은 순차컨테이너는 sort()나merge()를 사용할수없다
'IT책 > C++14 STL 철저 입문' 카테고리의 다른 글
1.8 함수를 인수로 전달하기 (0) | 2019.06.27 |
---|---|
1.7 알고리즘 (0) | 2019.06.26 |
1.6 스마트 포인터 (0) | 2019.06.25 |
1.4~5 반복자 (0) | 2019.06.25 |