我只是想知道我是否可以使用“复杂”地图作为另一张地图的值。我自定义了几个结构如下:
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并且我不会不知道为什么......
任何建议或解释将不胜感激!谢谢!
答案 0 :(得分:2)
dimPatternsMap currDpm = currReverseMap[support];
currDpm
是currReverseMap[support]
的副本。它不是同一个对象。因此,当您对currDpm
进行更改时,currReverseMap
内的任何内容都不会更改。
另一方面,如果您使用参考:
dimPatternsMap& currDpm = currReverseMap[support];
然后currDpm
和currReverseMap[support]
确实是同一个对象,因此后来使用currDpm
的语句实际上会更改currReverseMap
中的值。
还有一些其他地方您的代码也可以从引用中受益。
答案 1 :(得分:2)
我的猜测:你应该在你的其他地方使用一个引用:
dimPatternsMap& currDpm = currReverseMap[support];
您当前的代码会创建副本,而不是使用原始地图。
答案 2 :(得分:1)
你的问题就在这一行:
dimPatternsMap currDpm = currReverseMap[support];
根据它后面的代码,它想要这样读:
dimPatternsMap& currDpm = currReverseMap[support];
如果没有&
,则修改条目的副本而不是现有条目。
答案 3 :(得分:1)
您的代码正在制作下面对象的多个副本,尝试使用更多引用和迭代器(例如,find()
已经为您提供了一个元素。)
例如,dimPatternsMap currDpm = currReverseMap[support];
实际上会在您的结构中制作地图的副本,并为其添加元素(而不是原始元素)。请尝试使用引用。