如何创建地图的地图

How do you create a map of maps?

本文关键字:地图 创建 何创建      更新时间:2023-10-16

我想做以下事情:

.h
map<int, map<int,int> > forwardingTable;
.cpp
int
UpdateForwardingTable(int dest, int hop, int cost)
{
    if(forwardingTable.at(dest) != forwardingTable.end())
        forwardingTable.at(dest) = make_pair(hop, cost);
    else
        forwardingTable.insert(dest, make_pair(hop, cost));
}

但是我得到了无数的编译错误,类似于:

In file included from /usr/include/c++/4.8/map:60:0,
                 from globals.h:25,
                 from rtngnode.h:2,
                 from rtngnode.cpp:1:
/usr/include/c++/4.8/bits/stl_tree.h:316:5: note: template<class _Val> bool std::operator!=(const std::_Rb_tree_iterator<_Tp>&, const std::_Rb_tree_const_iterator<_Val>&)
     operator!=(const _Rb_tree_iterator<_Val>& __x,
     ^
/usr/include/c++/4.8/bits/stl_tree.h:316:5: note:   template argument deduction/substitution failed:
rtngnode.cpp:205:53: note:   ‘std::map<int, std::map<int, int, std::less<int> > >::mapped_type {aka std::map<int, int, std::less<int> >}’ is not derived from ‘const std::_Rb_tree_iterator<_Tp>’
  if(forwardingTable.at(dest) != forwardingTable.end())

我做错了什么吗?有更好的容器来装这种东西吗?

有两个问题:

1, make_pair返回pair,而不是map

2, at(dest)可能抛出out_of_range异常,参考map::at

应该是:

int
UpdateForwardingTable(int dest, int hop, int cost)
{
    map<int, map<int,int> >::iterator itr = forwardingTable.find(dest);
    if(itr != forwardingTable.end())
    {
        itr->second.insert(hop, cost);
        // forwardingTable.at(dest) = make_pair(hop, cost);
    } 
    else
    {
        map<int, int> obj;
        obj.insert(hop, const);
        forwardingTable.insert(dest, obj);
        // forwardingTable.insert(dest, make_pair(hop, cost));
    }
}