C++通过模板Map进行迭代

C++ iterate through a template Map

本文关键字:迭代 Map C++      更新时间:2023-10-16

当我有一个模板类,它包含模板映射和typedef在下面的代码中声明的const_iterator时,我如何迭代类外映射的元素,例如main,以将它们打印在输出上?

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迭代器可以在类之外使用吗?如果是,以何种方式?

您需要在模板上定义返回迭代器的成员函数:

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中添加了什么,为什么不直接使用它呢?

将begin((和end((成员添加到template_Map(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();
}

我添加非常量版本只是为了接口的完整性,在您的情况下可能不需要它。Than in main:

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

我不明白为什么要用另一个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
}