使用共享指针向量访问地图地图中的元素

时间:2011-08-01 17:10:07

标签: c++ map iterator shared-ptr

我有一种独特的情况,我无法正常工作。

我已经关注了许多使用地图地图的例子,但是共享指针的向量似乎让我感到有些偏差。

假设我有以下内容:

typedef boost::shared_ptr<RecCounts> RecCountsPtr;
typedef std::vector<RecCountsPtr> RecCountsPtrVec;
typedef std::map<std::string, RecCountsPtrVec> InnerActivityMap;
typedef std::map< std::string, InnerActivityMap > ActivityMap;

RecCounts是一个简单的结构。

现在,我想我已经找到了如何正确填充我的ActivityMap

RecCountsPtr recCountsPtr(new RecCounts());
config.actType = "M";
config.mapDate = "2010/07";

recCountsPtr->iHousehold = "50";
recCountsPtr->iZero = "150";

config.actMap[config.actType][config.mapDate].push_back(recCountsPtr);

是?我没有得到任何编译/运行时错误...但由于我还没有弄清楚如何访问地图的所有不同元素我无法确认这一点!

这是config结构:

struct Config
{
    std::string actType;
    std::string mapDate;

    // Map
    ActivityMap actMap;
    InnerActivityMap innerActMap;

    //Iterator
    ActivityMap::iterator actMapIter;
    InnerActivityMap::iterator innerActMapIter;
};

现在,假设我想访问ActivityMap的每个元素。我如何获得以下元素?

外图Key?

for (config.actMapIter= config.actMap.begin();
     config.actMapIter != config.actMap.end();
     ++config.actMapIter)
    {
        std::cout << "Outer Key = "
                  << (*config.actMapIter).first << std::endl;
    }

这似乎可以解决问题。

内图钥匙? 我无法弄清楚这一点。

内部地图矢量元素?

如果我知道这两个键,我可以这样做:

config.actMap[config.actType][config.mapDate][0]->iHouehold
config.actMap[config.actType][config.mapDate][0]->iZero

...但似乎无法弄清楚如何迭代它们。 :(

这就是我尝试迭代所有元素所做的。

for (config.actMapIter= config.actMap.begin();
         config.actMapIter != config.actMap.end();
         ++config.actMapIter)
    {
        std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;
        for (config.innerActMapIter = config.innerActMap.begin();
             config.innerActMapIter != config.innerActMap.end();
             ++config.innerActMapIter)
        {
            std::cout << "Inner Key = " 
                      << (*config.innerActMapIter).first << std::endl;
            for (size_t i = 0;
                 i < config.actMap[(*config.actMapIter).first]
                                  [(*config.innerActMapIter).first].size();
                 ++i)
            {
                std::cout << "iHousehold = "
                          << config.actMap[(*config.actMapIter).first]
                                          [(*config.innerActMapIter).first]
                                          [i]->iHousehold << std::endl;

                std::cout << "iZero = "
                          << config.actMap[(*config.actMapIter).first]
                                          [(*config.innerActMapIter).first]
                                          [i]->iZero << std::endl;
            }
        }
    }

我没有得到任何错误,但我只将外键打印到屏幕上:

  

外键= M

我怀疑我的内部迭代器有些不对劲...因为它与ActivityMap无关。即使我是对的,我也不知道如何建立这样的联系。

有什么建议吗?

ANSWER(感谢crashmstr):

以下是crashmstr建议的答案的详细版本。

for (config.actMapIter= config.actMap.begin();
     config.actMapIter != config.actMap.end();
     ++config.actMapIter)
{
    std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;

    InnerActivityMap innerActMap = (*config.actMapIter).second;
    InnerActivityMap::iterator innerActMapIter;

    for (innerActMapIter = innerActMap.begin();
         innerActMapIter != innerActMap.end();
         ++innerActMapIter)
    {
        std::cout << "Inner Key = " << (*innerActMapIter).first << std::endl;
        for (size_t i = 0;
             i < config.actMap[(*config.actMapIter).first][(*innerActMapIter).first].size();
             ++i)
        {
            std::cout << "iHousehold = "
                      << config.actMap[(*config.actMapIter).first]
                                      [(*innerActMapIter).first]
                                      [i]->iHousehold << std::endl;

            std::cout << "iZero = "
                      << config.actMap[(*config.actMapIter).first]
                                      [(*innerActMapIter).first]
                                      [i]->iZero << std::endl;
        }
    }
}

我将以下内容打印到屏幕上:

  

外键= M

     

Inner Key = 2010/07

     

iHousehold = 50

     

iZero = 150

1 个答案:

答案 0 :(得分:2)

在地图上进行迭代时,.first是“密钥”,.second是属于该密钥的数据。

所以在你的情况下:

for (config.actMapIter= config.actMap.begin();
    config.actMapIter != config.actMap.end();
    ++config.actMapIter)
{
    std::cout << "Outer Key = " << (*config.actMapIter).first << std::endl;
    //(*config.actMapIter).second is a std::map<std::string, RecCountsPtrVec>
    //create a new for loop to iterate over .second
}