Мне просто интересно, могу ли я использовать «сложную» карту в качестве значения другой карты. Я определил несколько структур следующим образом:
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, и я не понимаю не знаю почему …
Любые предложения или объяснения будут с благодарностью! Спасибо!!
dimPatternsMap currDpm = currReverseMap[support];
currDpm
является копией currReverseMap[support]
, Это не тот же объект. Итак, когда вы вносите изменения в currDpm
ничего внутри currReverseMap
изменения.
С другой стороны, если вы используете ссылку:
dimPatternsMap& currDpm = currReverseMap[support];
затем currDpm
а также currReverseMap[support]
на самом деле это один и тот же объект, поэтому более поздние заявления с использованием currDpm
действительно будет менять значение в currReverseMap
,
Есть несколько других мест, где ваш код может извлечь пользу и из ссылок.
Мое предположение: вы должны использовать ссылку в вашем другом:
dimPatternsMap& currDpm = currReverseMap[support];
Ваш текущий код создает копию вместо использования исходной карты.
Ваша проблема в этой строке:
dimPatternsMap currDpm = currReverseMap[support];
Основываясь на следующем коде, он хочет читать так:
dimPatternsMap& currDpm = currReverseMap[support];
Без &
Вы изменяете копию записи, а не существующую запись.
Ваш код делает несколько копий объектов снизу, попробуйте использовать больше ссылок и итераторов (find()
уже дает вам элемент, если он был найден, например).
Например, dimPatternsMap currDpm = currReverseMap[support];
фактически делает копию карты в вашей структуре и добавляет элемент к ней (не к оригиналу). Попробуйте использовать ссылку вместо этого.