문제

서로를 가리키는 두 가지 구조를 갖고 싶습니다.특히 나는 다음을 갖고 싶습니다 :

template<typename Key, typename Value> 
class MyStructure {
public:
  typedef map<Key, list<pair<Value, typename ListType::iterator>>> MapType;
  typedef list<typename MapType::element_type::iterator> ListType;
private:
  MapType map_;
  ListType list_;
}
.

ListType이 이전에 유형으로 선언되지 않으므로이 작업은 작동하지 않습니다.어떻게해야할까요?볼 수 있듯이이 두 구조의 요소의 포인터로 반복자 유형을 사용하고 있습니다.

나는 호기심 많은 반복적 인 템플릿 패턴을 사용하고 있지만 그걸로 어디에도 얻을 수 없었습니다.## C ++의 누군가도 템플릿 별칭을 사용하여 제안했지만 실패했습니다 (적어도, 나는이 아이디어를 사용하는 방법을 모르겠습니다).

뭔가 잘못하고, 개념적으로 뭔가를하고 있습니까?또는 "C ++ 개념과 일치하지 않는"아마도 "나는 확실히 void * s로 이것을 할 수 있지만, 나는 올바른 방법을 만들려고 노력하고있다 :)

감사합니다!

도움이 되었습니까?

해결책

이로 인한 것으로 의심되는 것은 중복 될 수 있지만 (그리고 여러면에서는 여러 가지 방법으로) "환호 및 HTH. - ALF"는 잠재적 인 중복 질문이 특히 이러한 종류의 사물에 대한 typedef의 사용에 대해 특별히 밝혀 졌음을 지적합니다..

그러나, 현재의 질문에서, 영업청은 일반적으로 질문에 기술 된 시나리오에서 상호 포함을 어떻게 처리하는지 알고 싶다.

여기에 제안 사항이 있습니다.

#include <list>
#include <map>

template <typename Key, typename Value>
class MyElement;

template <typename Key, typename Value>
class MyStructure
{
public:
  typedef std::map<Key,MyElement<Key,Value> > MapType;
  typedef std::list<MyElement<Key,Value> >    ListType;
};

template <typename Key, typename Value>
class MyElement {
public:
  typename MyStructure<Key,Value>::MapType::iterator  map_iterator;
  typename MyStructure<Key,Value>::ListType::iterator list_iterator;
};
.

보시다시피, List Iterator 및 Map Iterator가 포함 된 새 데이터 유형 MyElement를 도입했습니다.이기 때문에 typedef보다는 클래스이기 때문에 앞으로 선언 될 수 있습니다.

다른 팁

이것은 불행히도 불가능합니다.

다른 한편으로는 스토리지를 반전시킬 수있는 것처럼 보입니다.

listValues를 사용한 다음 맵 이이 목록을 가리 킵니까?

이것은 순환 의존성을 깨뜨릴 수 있습니다.

typedef std::list< std::pair<Key, Value> > ListType;
typedef std::multiset<typename ListType::iterator, CmpFirst> MapType;
.

(실제로 당신이 달성하려는 것을 정말로 이해했는지 확실하지 않으면 ...)

다른 솔루션은 boost.multiindex .여러 반복 / 조회 패턴이 필요할 때, Boost.MultiIndex는 값 내의 인덱스를 인터리빙하여 저장소를 최소화하도록 핸드 메이드 솔루션보다 더 좋은 대안입니다.일관성과 동일한 요소 집합을 참조하는 모든 인덱스가 주어진다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top