2011-02-14 2 views
0

나는 table_list액세스

class GroupingClass 
{ 
    table_list m_table_list; 
    string Buildkey(OD e1){ 
     string ostring; 
     ostring+=string(e1.m_Date,sizeof(Date)); 
     ostring+=string(e1.m_CT,sizeof(CT)); 
     ostring+=string(e1.m_PT,sizeof(PT)); 
     return ostring; 
    } 
    void operator() (const map<short1,short2>::value_type& myPair) { 

     OD e1=myPair.second; 
     string key=Buildkey(e1); 
     m_table_list[key][e1.m_short1]=e1.m_short2; 
    } 

    operator table_list() { 
    return m_table_list; 
    } 
}; 

채우기 클래스가 나는

table_list TL2  
    GroupingClass gc; 
    TL2=for_each(mapOD.begin(), mapOD.end(), gc); 

하지만 때 의해 사용

typedef short short1 
typedef short short2 
typedef map<short1,short2> data_list; 
typedef map<string,data_list> table_list; 

을 정의 복잡한지도가 내부지도에 액세스하려고합니다. 문제가 있습니다. 예 :

data_list tmp; 
tmp=TL2["AAAA"]; 
short i=tmp[1]; //I dont update i variable 

0을 디버깅 할 때, 나는 코드를 볼 수는 TMP의 var에 오류이 원인 const 때 map.then 새로운 값을 추가하려고

하지만 난 제대로 itrator에 의해 이유를이 작품을 루프를 사용하는 경우 처음에는 아무런 작업이 없었습니다 감사합니다 herzl

+0

지도에 예상 한 내용이 포함되어 있는지 확인 하시겠습니까? 예를 들어'm_table_list [key] [e1.m_short2] = e1.m_short2; '라는 줄은 의심스럽고 키와 값은 같습니다 ... – Nim

+0

지도가 다른 방법으로 포함되어 있는지 확인합니다 : for (it = tmp.begin(); it! = tmp.end(); it ++) {i = it-> first; j = it-> second; } –

+0

은 구조체 OD를 보여 주시기 바랍니다.이 구조체는 아마도 암시 적 생성자가 short이고 m_short1, m_short2, m_Date, m_CT 및 m_PT라는 멤버가 있습니다. 펑 터는 일반적으로 가볍고 문자열에서부터 짧은지도까지의 맵을 포함하지 않습니다. – CashCow

답변

1

std::map<Key,Value>::operator[](Key const& k)하여 사용합니다. 발견되지 않으면 새로운 Value()을 삽입하고 이에 대한 참조를 반환합니다. 이것은 수정 작업입니다. 따라서 operator[]은 비 const입니다.

+0

하지만 '키'와 '값'이 존재하며 반복기를 사용할 때 볼 수 있습니다. [] 연산자를 사용할 때 찾을 수 없습니까? –

+0

컴파일러는 런타임에 키가 존재하는지 알 수 없습니다. 안전을 위해'const map'에서'operator []'를 허용하지 않습니다. – MSalters

0

코드가 맞지 않습니다. 외전은 무엇입니까? myPair.second는 operator()에서 짧을 것이지만 e1.m_short2는 의미가 없습니다.

아마도 for_each는 값에 따라 세 번째 매개 변수를 취합니다. 즉, 해당 맵의 복사본을 만들므로 변경 내용이 손실 될 수 있습니다.

강제로 for_each는 템플릿 매개 변수를 직접 지정하거나 boost :: ref를 래핑하여 참조하여 세 번째 값을 가져올 수 있습니다. 그러나 당신은 당신의 Functor가지도의 인스턴스를 가지기보다는 그것의 생성자에서 참조로 만들어지는 맵을 가져 오도록 훨씬 더 잘 할 것입니다.

class GroupingClass 
{ 
    table_list & m_table_list; 
    string Buildkey(OD e1) 
    { 
     string ostring; 
     ostring+=string(e1.m_Date,sizeof(Date)); 
     ostring+=string(e1.m_CT,sizeof(CT)); 
     ostring+=string(e1.m_PT,sizeof(PT)); 
     return ostring; 
    } 
    public: 
    explicit GroupingClass(table_list & the_table_list) : 
    m_table_list(the_table_list) 
    { 
    } 

    void operator() (const map<short1,short2>::value_type& myPair) const 
    { 

     OD e1(myPair.first); // probably what you meant 
     string key=Buildkey(e1); 
     m_table_list[key][e1.m_short1]=e1.m_short2; 
    // did you mean m_table_list[key][myPair.first] = myPair.second; ? 
    } 
}; 

k를 찾습니다

table_list TL2; 
for_each(mapOD.begin(), mapOD.end(), GroupingClass(TL2)); 
+0

이것은 내 실수였습니다 –