2013-05-14 3 views
1

먼저 문제부터 시작합니다. 나는 나무가 있고, 나는 다음을 수행 할 : 나는 용기 공동 분산 문제로 실행 해요C++/STL에서 컨테이너 공분산 사용법

class Base { 
    std::vector<Base*> children_; 
}; 

class DerivedA : public Base { 
    //adds some members 
}; 

class DerivedB : public Base { 
    void AddChildren(std::vector<DerivedA*> children, int position) { 
     //Do stuff based on the fact that it's a DerivedA 
     //Add to the list of children_ 
    } 
    void AddChildren(std::vector<DerivedB*> children, int position) { 
     //Do stuff based on the fact that it's a DerivedB 
     //Add to the list of children_ 
    } 
}; 

- A는 std::vector<DerivedA*> (또는 DerivedB*)를 std::vector<Base*>와 동일하지 않습니다. 그러나 동시에 나는 AddChildren에 완전히 새로운 벡터를 작성하여 std::vector<Base*>에 추가하기를 원하지 않습니다.

너무 많은 성능 오버 헤드없이 벡터를 children_의 목록에 직접 추가 할 수있는 방법이 있습니까?

내가 생각하고 특히 싫어 한 것들 :

  • 겪고과 children_에 추가 할 새 std::vector<Base*> 만들기 개별적으로
  • 각 요소를 추가는 (컴파일러를 제외하고는이를 최적화 할 수 있습니까?)
  • std::vector<Base*>을 전달하고 각 요소를 dynamic_casting합니다.
  • std::vector<Base*>을 전달하고 dynamic_cast을 통해 첫 번째 요소를 검사 한 다음 나머지는 static_cast을 사용하여 검사합니다.
  • AddChildren을 템플릿 기능으로 만들기 (std::vector이 저장되고 나중에 AddChildren이 나중에 호출 됨) 어떻게 작동하는지 생각할 수 없었습니다.

내가 재 해석 할 수는 있지만 위험한 것은 무엇입니까? 이게 위험한가요?

union DerivedBUnion { 
    std::vector<Base*>  base_; 
    std::vector<DerivedB*> derivedB_; 
} 

도움을 주시면 감사하겠습니다.

답변

5

children_.insert(children_.end(), children.begin(), children.end())의 문제점은 무엇입니까? 모든 종류의 캐스트에 대해 생각하기 전에 직접적인 해결책이 성능 문제를 야기한다는 것을 입증하는 것이 합리적이지 않습니까?

+0

현실적인 확인을 가져 주셔서 감사합니다. 어떤 이유로 나는 기본 벡터가 다른 유형이기 때문에 실제로 작동하지 않을 것이라고 생각했다. 나는 이터레이터를 완전히 이해하지 못했다. – gremwell