내 프로젝트 중 하나에서 트리 구현을 사용 중입니다. 여기서 컨테이너 C=std::map<K,V>
을 사용하여 각 트리 노드에 대한 하위 목록을 유지 관리합니다. 각 트리 노드에는 K
이라는 고유 한 이름 키가 일반적으로 std::string
입니다.컨테이너 템플릿 매개 변수 std :: map 또는 std :: vector
template<typename V, template<typename Key=std::string,typename Type=TreeNode<V>,typename ...> typename C>
class TreeNode {
typedef C<std::string, Value> cont_type;
typedef V data_type;
cont_type childs;
data_type value;
cont_type::iterator genericFind(const K& k) {
// Something generic here!!!
}
}
이 구현은 표준 : 맵이 트리에 삽입의 순서를 존중하지 않는, 사실 외에 저를 위해 아주 잘했다. 일부 응용 프로그램의 경우 삽입 순서를 유지해야하지만 다른 응용 프로그램의 경우 빠른 정보 재 지정이 더 중요합니다.
는 따라서 C
내가 내 TreeNode
클래스의 구현에 문제가 없음 아직 명시 적으로 std::map
의 인터페이스를 사용하여
std::vector<std::pair<K, V>> // keeping insertion order
또는
std::map<K,V> // fast information retrivial
유형 중 하나가 될 필요가있다. 특히 멤버 함수 find
, erase
, insert
을 사용합니다. 두 컨테이너 유형의 구현이 매우 구체적 인 일반 항목으로 대체해야합니다.
예를 들어 std::vector
구현을 플러그인 할 때마다 childs.find(key)
을 find(childs.begin(), childs.end(), key)
으로 바꿔야합니다.
아마도 내가 알지 못하는 다른 해결책이있을 수 있습니다. 아마 boost::multi_index
일지 모르지만 나는 이것에 대해 확실히 확신하지 못합니다.
내 문제를 해결하는 가장 쉬운 방법은 무엇일까요?
프리 페치로 인해 벡터가 매우 빨라질 수 있습니다. "천천히"하는 것으로 그들을 해고하지 마십시오. 나는 (과학만을 위해) 벡터 구현을하고 성능 차이를 측정 할 것을 제안한다. – Hayt
다음과 같은 것이 도움이 될 수 있습니다. http://codereview.stackexchange.com/a/59999/42409 – Deduplicator
하나는 시퀀스 컨테이너이므로 다른 컨테이너는 대칭에 가까운 것을 찾기를 기대합니다. 그럼에도 불구하고 빠른 검색이 실제로 메뉴에있는 경우 연관 컨테이너에 대해 'unordered_map'을 할인하지 마십시오. 가치가있는 가치. 당신의'지우기 '요구 사항이 아니라면, 나는 값의 벡터와 벡터를 벡터 인덱스에 매핑하는 맵 (당신이 선택한 종류)을 유지할 것을 제안했을 것입니다.하지만'지우기'는 수영장. – WhozCraig