2011-12-07 106 views
3

當我有一個模板類,其中包含模板地圖和一個const_iterator如下面的代碼typedef所聲明的那樣,我如何迭代遍歷類中的地圖元素,他們在輸出?C++通過模板迭代地圖

template<class K, class V> 
class template_map{ 
private: 

    typedef typename std::map<K,V> TMap; 
    TMap my_map; 

public: 
    typedef typename TMap::const_iterator const_iterator; 
    ... 
}; 

int main() 
{ 

template_Map<int,double> Map1 //suppose that contains elements 

? 
} 

更新:能typedef的迭代器類的外部使用?如果是以什麼方式?

+0

您的主要功能是錯誤的。完整的類型將是,例如'template_map '。然後你可以說'template_map :: const_iterator'來命名你的迭代器。您還必須在'template_map '的公共接口中公開'my_map'的迭代器函數。 –

回答

4

您需要在您的模板,將返回迭代器定義的成員函數:

template<class K, class V> 
class template_map{ 

private: 

typedef typename std::map<K,V> TMap; 
TMap my_map; 

public: 
    typedef typename TMap::const_iterator const_iterator; 
    const_iterator begin() const { return my_map.begin(); } 
    const_iterator end() const { return my_map.end(); } 
}; 

然後:

int main() 
{ 
    template_map<int, int> m; 
    // Populate map... 

    // Then iterate... 
    for (auto i = m.begin(); i != m.end(); i++) 
    { 
    } 
} 

但是,我不確定您添加到std::map這裏,爲什麼不直接使用它呢?

0

我不明白你爲什麼想用另一個包裝map類。你爲什麼不std::map本身?

迭代在std::map則通常是這樣的:

for(std::map<mykey, myvalue>::iterator it = mymap.begin(); it != mymap.end(); ++it) 
{ 
    somevar = it->first; // <<--- points to your key 
    someothervar = it->second; // points to your value 
} 
+0

這是必需的,這不是我的選擇。 – arjacsoh

1

將begin()和end()成員添加到template_Map(const和非const變體)。

const_iterator begin() const { 
    return my_map.begin(); 
} 
const_iterator end() const { 
    return my_map.end(); 
} 
iterator begin() { 
    return my_map.begin(); 
} 
iterator end() { 
    return my_map.end(); 
} 

我添加了非const的版本只是爲了接口的完整性,在您的情況下可能不需要。 比主要:

typedef template_Map<x, y> template_MapXY; 
template_MapXY Map1; 
... 
for (template_MapXY::const_iterator it(Map1.begin()), end(Map1.end()); it != end; ++ it) { 
    ... 
}