먼저 문제부터 시작합니다. 나는 나무가 있고, 나는 다음을 수행 할 : 나는 용기 공동 분산 문제로 실행 해요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_;
}
도움을 주시면 감사하겠습니다.
현실적인 확인을 가져 주셔서 감사합니다. 어떤 이유로 나는 기본 벡터가 다른 유형이기 때문에 실제로 작동하지 않을 것이라고 생각했다. 나는 이터레이터를 완전히 이해하지 못했다. – gremwell