문제

는 가장 좋은 방법은 무엇입(C++)를 설정할 수 있도록 컨테이너에 대한 더블 indexing?특히,나는 개체 목록,각 인덱싱하는 키(아마도 여러 키당).이 의미는 multimap.이 문제는,그러나,그것이 의미하는 가능하게 악화보다 선형회의 위치를 찾을 수 있습니다.나는 오히려 중복을 방지하기 위해 데이터의,그래서는 각 개체를 유지 그것의 자신의 조정과 이동해야에 자체에도 나쁜 것(말할 것도 없고 움직이는 당신의 자신의 개체할 수 있는 간접적으로 통화의 소멸자에서 동안 회원 기능!).내가 오히려 어떤 컨테이너가 유지되는 인덱스에 의해 모두 개체 포인터를 조정,그리고 물체들을 보장 안정적인 참조/포인터입니다.다음 각 객체를 저장할 수있는 반복하여 인덱스(을 포함하여 조정),충분히 추상하는,그리고 어디에 있는지 알 것이다.습니다.MultiIndex 처럼 생각하지만,그것은 매우 무서운지만 뷰만큼은 단언컨데 사방 최 실 객체를 할 필요가 const.

당신은 무엇을 권장합니까?

편집:부 Bimap 좋은 것 같다,하지만 안정적인 인덱싱?가,변경하는 경우 좌표 참조하는 다른 요소를 유지해야 유효합니다.그 이유는 내가 사용하려면 포인터를 인덱싱이기 때문에 객체가 그렇지 않으면 더 본질적인 주문하고 포인터를 일정하게 남아 있을 수 있습니다면 객체의 변경(수 있도록에서의 사용을 높일 MultiIndex 는,IIRC,를 제공하지 않 안정적인 인덱싱).

도움이 되었습니까?

해결책

나는 여러 가정에 따라 작성자:

  • 키 저렴한 복사하고 비교
  • 가 있어야만 하나의 복사본에 있는 개체의 시스템
  • 같은 키를 참조할 수 있습니다 많은 개체는지만,하나의 객체에 해당 주어진 키(일)
  • 할 수 있을 효율적으로 보이는 객체에 대응하는 지,그리고는 열쇠에 해당하는 특정 개체

세요:

  • 사용하는 링크 목록하거나 일부 다른 컨테이너를 유지하는 세계의 목록에 있는 모든 개체 시스템입니다.체에 할당된 연결 목록입니다.
  • 을 만들 하나 std::multimap<Key, Object *> maps 키체 포인터를 가리키는 하나의 정규의 위치에 연결 목록입니다.
  • 중 하나를 수행:
    • 을 만들 하나 std::map<Object *, Key> 수있는 보 키에 부착된 특정 개체입니다.는지 확인하는 코드를 업데이트 맵 때 키가 변경되었습니다.(이것은 또한 수 std::multimap 필요할 경우 많은 많은 관계이다.)
    • 추가 구성원이 변수 Object 을 포함하는 현재 Key (수 있도록 O(1)검색).확인 코드를 업데이트를 이 변수는 경우 키가 변경되었습니다.

이후 아래 언급된"좌표"키로,당신은 또한에 관심이있을 수 있습니다 읽는 제안서 는 가장 빠른 방법을 찾는 경우에는 3D 좌표를 이미 사용.

다른 팁

그것의 이해하기 어려울 정확히 무엇을 하고 있는 그지만,그것처럼 보인 향상 bimap 당신이 원하는 것입니다.그것은 기본적으로 향상을 다 지수를 제외하고 특정 사용하는 경우,그리고 쉽게 사용할 수 있습니다.그것은 빠른 검색 기반으로 첫 번째 요소는 두 번째 요소입니다.당신은 왜 찾는 업체의 위치에 지도하여 그것의 주소는?를 사용하여 추상화하고자 할 모든 당신을 위해 작업을 수행합니다.그냥 참고:반복을 통해 모든 요소에서 지도 O(N)도록 보장할 O(N)(더 나쁘지 않)하는 방법 당신은 당신의 생각을 하고 있습니다.

하나의 옵션을 사용하는 것이 두 std::지도는 참조되 shared_ptrs.이 같은 뭔가를 얻을 수 있습니다 당신이 가고:

template<typename T, typename K1, typename K2>
class MyBiMap
{
public:
    typedef boost::shared_ptr<T> ptr_type;

    void insert(const ptr_type& value, const K1& key1, const K2& key2)
    {
        _map1.insert(std::make_pair(key1, value));
        _map2.insert(std::make_pair(key2, value));
    }

    ptr_type find1(const K1& key)
    {
        std::map<K1, ptr_type >::const_iterator itr = _map1.find(key);
        if (itr == _map1.end())
            throw std::exception("Unable to find key");
        return itr->second;
    }

    ptr_type find2(const K2& key)
    {
        std::map<K2, ptr_type >::const_iterator itr = _map2.find(key);
        if (itr == _map2.end())
            throw std::exception("Unable to find key");
        return itr->second;
    }

private:
    std::map<K1, ptr_type > _map1;
    std::map<K2, ptr_type > _map2;
};

편집:나는 그냥 나타났 multimap 요구 사항,이것은 여전히 표현하고 그래서 나는 그것을 남겨.

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