2016-12-18 2 views
1

불변성을 제공하는 STL 컨테이너 클래스를 찾습니다 (컨테이너가 생성되면 컨테이너에서 CRUD를 수행 할 수 없으며 모든 읽기 전용입니다).STL 컨테이너 클래스가 변경되지 않습니까?

확실히 STL 컨테이너 클래스를 상속 받아서 불변의 버전을 만든 다음 모든 CRUD 메서드를 민영화하고 변경 가능한 컨테이너를 입력으로 유지하는 생성자 만 유지할 수 있습니다. 예 :

template<T> 
public class ImmutableVector<T>(): public vecotr<T>() 
{ 
    private void clear(); 

... 
} 

하지만 많은 작업이 필요합니다. 내 질문은 : 저기 거기 STL 불변의 라이브러리가 세계에 있습니까?

+1

어떻게 첫번째 장소에있는 컨테이너에 항목을받을 수 있습니까? –

+1

주문 순서 : CRUD의 "R"은 "읽기"의 약자로, 해당 방법을 비활성화하지 않으려 고합니다. –

+1

@RichardCritten : 물론 생성자를 통해. –

답변

11

const 컨테이너를 사용할 수 있습니다. a const std::vector<int>. 아마도 초기화 및 채우기 시간에 변경 가능한 컨테이너를 사용하고 나중에 const_cast을 사용하여 캐스트하거나 const 컨테이너로, 더 많은 경우 const 컨테이너 참조 (예 : 정식으로 const std::vector<int> &vi을 전달하십시오. 어떤 기능에).

+0

이것은 매력처럼 작동합니다! 나는 오랫동안 자바 세계에 살고있다. 감사! –

0

C++에는 변경할 수없는 컨테이너가 없습니다. 불변 컨테이너를 만드는 가장 좋은 방법은 정확히 무엇을하고 있는지입니다.

내부에 포함 된 std::vector을 초기화하기 위해 이니셜 라이저 목록을 사용하는 ImmutableVector<T> 클래스를 만드는 것이 좋습니다. 이 방법을 사용하면 std::vector을 확장하는 대신 const 반복자와 함수를 노출 할 수 있습니다. STL이 읽기 전용이 아닌 다른 메서드를 구현하면 수동으로 사용하지 않도록 설정할 때까지 사용할 수 있습니다.

예 :

template<typename T> 
public class ImmutableVector<T> 
{ 
    std::vector<T> vec; 
public: 
    typedef T value_type; 
... 
} 
+0

답변 해 주셔서 감사합니다. 개체에 const가 손톱! 나는 그것을 시험했다. 그것은 작동합니다. 그것은 컴파일 시간에 그것을 잡을 수 있습니다. –

+0

const가 일을하고 있다면, 왜 누군가가 그렇게 많은 일을해야합니까? – Klaus

+1

오브젝트에 대한 const는'const_cast '를 사용하여 제거 할 수 있습니다. 또한 STL 컨테이너는 특히 캐시 지역성에있어 성능 제한이있을 수 있습니다. 나는 모든 사람들이 자신의 벡터를 만들 것을 제안하지는 않지만, 절대적으로 필요하다면 그렇게 할 수있다. – nopjmp