2011-11-26 3 views
0

삽입 순서대로 요소를 저장하는 연관 배열 (예 : std :: map)을 만들 것입니다. 나는 새로운 요소를 삽입 표준 : :지도 믹스 반복자 때문에 대신에 표준 : :지도를 unordered_map도 사용삽입 순서 std :: map

template <typename K, typename V> 
class My_Map : public std::unordered_map<K,V> 
{ 
public: 
V& operator[](const K&& key) 
    { 
    typename std::unordered_map<K,V>::iterator __i = find(key); 
    if (__i == std::unordered_map<K,V>::end()) //se non l'ho trovato... 
    { 
     __i = insert(__i, std::make_pair(std::move(key), V())); 
     mHistory.push_back(__i);std::cout<<"Sto inserendo: "<<key<<std::endl; 
    } 
    return (*__i).second; 
    } 

    typename std::unordered_map<K,V>::iterator cbegin() const 
    { 
     return *mHistory.cbegin(); 
    } 

    typename std::unordered_map<K,V>::iterator cend() const 
    { 
     return *mHistory.cend(); 
    } 

    private: 
    std::list<typename std::unordered_map<K,V>::iterator> mHistory; 
}; 

using namespace std; 

int main() 
{ 
    My_Map<string,int> myMap; 


    myMap["1"] = 1; 
    myMap["23"] = 23; 
    myMap["-3"] = 3; 
    myMap["23"] = 28; 
    myMap["last element"] = 33; 

    for (auto x = myMap.cbegin(); x != myMap.cend(); ++x)//{std::cout<<"sn dentro\n";} 
     cout<<(*x).first <<"\t"<<x->second<<endl; 
} 

:이 클래스를 썼다.

이 코드에는 문제가 있습니다. main()에서 for for segmentation fault가 실패합니다. cbegin()과 cend()로 전달 된 반복자는 유효하지 않습니다 ... 왜? 뭐가 문제 야?

+3

정확히 Boost.multi_index를 확인하십시오. –

+0

[MCT] (https://launchpad.net/libmct/)에도 연결된지도가 있습니다. – doublep

+6

컨테이너 (가상 소멸자가없는 것)와 같은 컨테이너에서 파생시키지 않는 것이 좋습니다. 일반적으로 선행 밑줄이있는 변수 이름은 컴파일러 및 표준 라이브러리 용으로 예약 된 것으로 간주됩니다. 내가 틀렸을 수도 있지만 당신이 std :: vector를 사용할 수 있기를 원한다면 정렬되지 않은 맵은 삽입 순서를 보장하지 않는다고 확신한다. 그러나 pair와 같은 연관 배열로 키 의미에 의한 액세스를 갖지는 않을 것이다. PHP 또는 그 밖의 것들. – 111111

답변

2

가장 먼저해야 할 일은 목록의 최종 반복자를 역 참조 할 수 없다는 것입니다. 둘째, yourMap.cend에 반드시 yourMap.cbegin에서 연결할 수 있는지 의심 스럽습니다.

저장 한 지도 반복자 지도 항목에 대한 포인터를 자동으로 역 참조하는 목록 반복기에 대한 어댑터가 필요할 수 있습니다.

어쨌든 unordered_map의 임의의 지점에서 다른 임의의 지점으로 이동하지 말고 목록을 반복해야합니다.


또한 : 요소를 추가하는 것은 반복자을 무효화하는, 다시 해싱을 일으킬 수 있습니다 (하지만 포인터 또는 요소에 대한 참조). unordered_map에 반복자를 저장해서는 안됩니다.

+0

동일한 std :: map insert 구문을 사용하기 위해 boost_multiindex를 사용하지 않고이 문제를 해결할 수있는 방법이 있습니까? (myMap [myKey] = myValue;) – Superman