Доступ к элементам в картах карт с векторами общих указателей - PullRequest
1 голос
/ 01 августа 2011

У меня есть несколько уникальная ситуация, с которой я не совсем могу работать.

Я следил за многими примерами использования карт карт, но вектор общих указателей, кажется, немного сбивает меня с толку.

Предположим, у меня есть следующее:

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.Как бы я получил следующие элементы?

Ключ внешней карты?

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. Даже если я правЯ не знаю, как сделать такую ​​ассоциацию.

Есть предложения?

ОТВЕТ (благодаря 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

Внутренний ключ = 2010/07

iHousehold = 50

iZero = 150

1 Ответ

2 голосов
/ 01 августа 2011

При итерации по карте .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
}
...