Мне просто интересно, могу ли я использовать «сложную» карту в качестве значения другой карты. Я самостоятельно определил несколько структур следующим образом:
typedef std::vector<std::string> pattern;
typedef std::map<int, std::vector<pattern>> dimPatternsMap;
typedef std::map<int, dimPatternsMap> supportDimMapMap;
Хорошо, позвольте мне объяснить эти вещи... pattern
- это вектор строк. Для «меньшей» карты dimPatternsMap
ключ представляет собой целое число, которое представляет собой размер шаблона (размер этого вектора, содержащего строки), а значение представляет собой вектор, содержащий шаблоны (который является вектором векторов...).
«Большая» карта supportDimMapMap
также использует целое число в качестве значения ключа, но использует dimPatternsMap
в качестве значения. Ключ означает «счетчик поддержки».
Теперь я начинаю строить эту «сложную» карту:
supportDimMapMap currReverseMap;
pattern p = getItFromSomePlace(); //I just omit the process I got pattern and its support
int support = getItFromSomePlaceToo();
if(currReverseMap.find(support) == currReverseMap.end()) {
dimPatternsMap newDpm;
std::vector<pattern> newPatterns;
newPatterns.push_back(currPattern);
newDpm[dim] = newPatterns;
currReverseMap[support] = newDpm;
} else{
dimPatternsMap currDpm = currReverseMap[support];
if(currDpm.find(dim) == currDpm.end()) {
std::vector<pattern> currDimPatterns;
currDimPatterns.push_back(currPattern);
currDpm[dim] = currDimPatterns;
} else {
currDpm[dim].push_back(currPattern);
}
}
Простите, код действительно массовый...
Но тогда, когда я хочу пройти по карте, например:
for(supportDimMapMap::iterator iter = currReverseMap.begin(); iter != currReverseMap.end(); ++iter) {
int support = iter->first;
dimPatternsMap dpm = iter->second;
for(dimPatternsMap::iterator ittt = dpm.begin(); ittt != dpm.end(); ++ittt) {
int dim = ittt->first;
std::vector<pattern> patterns = ittt->second;
int s = patterns.size();
}
}
Я обнаружил, что значение s
всегда равно 1, что означает, что для каждого уникального значения поддержки и для каждого измерения этого значения поддержки существует только один шаблон! Но когда я отлаживаю свой код в процессе построения карты, я действительно обнаружил, что размер не равен 1 - я действительно успешно добавил новые шаблоны на карту... Но когда дело доходит до обхода, все размеры становятся равными 1, и я не не знаю почему...
Любые предложения или объяснения будут с благодарностью! Спасибо!!
find
, посколькуoperator[]
будет создавать значение по умолчанию всякий раз, когда ключ новый, а контейнер, созданный по умолчанию, является пустым контейнером. Весь этот блок кода можно было бы переписать всегоcurrReverseMap[support][dim].push_back(pattern);
. - person aschepler   schedule 03.11.2013std::array<T,N>
— яркий контрпример. - person aschepler   schedule 03.11.2013else
), но в самом низу всегда должен быть размер 1 - person UnholySheep   schedule 03.11.2013