У меня есть несколько уникальная ситуация, с которой я не совсем могу работать.
Я следил за многими примерами использования карт карт, но вектор общих указателей, кажется, немного сбивает меня с толку.
Предположим, у меня есть следующее:
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