vector — c ++: использовать карту в качестве значения другой карты

Мне просто интересно, могу ли я использовать «сложную» карту в качестве значения другой карты. Я определил несколько структур следующим образом:

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, и я не понимаю не знаю почему …

Любые предложения или объяснения будут с благодарностью! Спасибо!!

1

Решение

dimPatternsMap currDpm = currReverseMap[support];

currDpm является копией currReverseMap[support], Это не тот же объект. Итак, когда вы вносите изменения в currDpmничего внутри currReverseMap изменения.

С другой стороны, если вы используете ссылку:

dimPatternsMap& currDpm = currReverseMap[support];

затем currDpm а также currReverseMap[support] на самом деле это один и тот же объект, поэтому более поздние заявления с использованием currDpm действительно будет менять значение в currReverseMap,

Есть несколько других мест, где ваш код может извлечь пользу и из ссылок.

2

Другие решения

Мое предположение: вы должны использовать ссылку в вашем другом:

dimPatternsMap& currDpm = currReverseMap[support];

Ваш текущий код создает копию вместо использования исходной карты.

2

Ваша проблема в этой строке:

dimPatternsMap currDpm = currReverseMap[support];

Основываясь на следующем коде, он хочет читать так:

dimPatternsMap& currDpm = currReverseMap[support];

Без & Вы изменяете копию записи, а не существующую запись.

1

Ваш код делает несколько копий объектов снизу, попробуйте использовать больше ссылок и итераторов (find() уже дает вам элемент, если он был найден, например).

Например, dimPatternsMap currDpm = currReverseMap[support]; фактически делает копию карты в вашей структуре и добавляет элемент к ней (не к оригиналу). Попробуйте использовать ссылку вместо этого.

1
По вопросам рекламы [email protected]