2013-03-03 1 views
1

성능과 메모리 사용을 유지하면서 동일한 요소가 다른 침투성 컨테이너에 나타날 수있는 가능성을 이해하지 못했습니다. boost::intrusive 설명서에 명시되어 있습니다.boost :: intrusive containers에서 하나의 요소에 대한 혼란

가 침입 컨테이너가 통과 객체의 복사본을 저장하지만, 저장 개체를 스스로하지 않습니다

문서

는 말한다. 을 컨테이너에 삽입하는 데 필요한 추가 데이터는 개체 자체에서 제공해야합니다. 예를 들어, 연결리스트를 구현하는 침입 용기에 MyClass를 삽입, MyClass는 필요한 다음 및 이전 포인터를 포함해야합니다
class MyClass 
{ 
    MyClass *next; 
    MyClass *previous; 
    // ... 
}; 

STL과 향상의 차이점 :: 침입 용기를 밑줄 , 문서는 말한다 :

비 간섭 컨테이너가 몇 가지 제한 사항이 있습니다 :

개체는 하나의 컨테이너에만 속할 수 있습니다. 두 컨테이너간에 개체를 공유하려면 이러한 개체의 복사본을 여러 개 저장해야하거나 포인터 컨테이너 ( std::list<Object*>)를 사용해야합니다.

의미가 있습니다. 요소는 두 개가 될 수 없습니다. std::list 괜찮아. 그러나 유형 MyClass의 한 인스턴스는 두 개의 다른 boost::intrusive::list에 삽입 될 수 있습니다. 예를 들어 이러한 요소에는 다음 요소에 대한 포인터와 이전 요소에 대한 포인터가 하나만있을 수 있습니다. 잘못된 것이 아니라면 하나의 컨테이너를 수정하면 다른 컨테이너도 수정할 수 있다고 가정 할 때만 작동합니다.

+0

나는 이것에 대해 생각해 본 이래로 꽤 오랜 시간이 걸렸지 만, [std :: list.splice'] (http : //en.cppreference.co.kr/w/cpp/container/list/splice) 관입 목록을 사용하지 마십시오 – David

+0

처음 세 번이 질문을 완전히 오독했습니다. –

답변

0

Boost.Intrusive 라이브러리하지 litterallyprevnext 포인터를 정의하도록 요구하지 않습니다 - 문서의 일부에, prevnext 포인터의 존재는 단지 침입 컨테이너가 작동하는 방법의 개념도이다.

침투성 컨테이너를 정의하는 실제는 상속을 통한 후크 또는 prevnext 포인터를 포함하는 멤버로 포함됩니다. 여러 가지 후크 (다른 정적 유형으로 태그가 지정됨)를 포함시킴으로써 동일한 객체를 여러 개의 다른 간섭 형 컨테이너 (서로 다른 정적 유형으로 태그가 지정됨)에 포함 할 수 있습니다.

후크가 어떻게 작동하는지 보려면 http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.html을 참조하십시오. 여러 침입 행위자에게이 작업을 수행하는 방법에 대한 예는 this StackOverflow answer을 참조하십시오.

이것은 제한이 있습니다. 런타임에 정의 된 여러 침투성 컨테이너의 임의의 집합에 개체를 포함 할 수 없습니다. 처음에 개체를 코딩 할 때 사용할 컨테이너를 알고 빌드해야합니다 각 개체에 대한 지식.

+0

확인. 이제는 분명합니다. 내가 빠뜨린 것은 "여러 가지 갈고리를 포함하는 것"입니다. – Martin

+0

"관입 컨테이너를 정의하는 실제는 상속을 통한 후크를 포함하거나 이전 및 다음 포인터를 포함하는 멤버로 포함하는 것입니다"- 실제로 사용자 정의 NodeTraits 및/또는 ValueTraits를 구현하여 기존의 모든 연결 체계 당신은 지원하기를 원합니다. 따라서 요소의 벡터와 그 위에 목록 컨테이너를 정의하는'pair ' 벡터를 가질 수 있습니다. 부스트 침입은 미친 듯이 유연합니다. – sehe