1

我只是想知道我是否可以使用“复杂”的地图作为另一张地图的价值。我已经自定义了几个结构如下:

typedef std::vector<std::string> pattern;
typedef std::map<int, std::vector<pattern>> dimPatternsMap;
typedef std::map<int, dimPatternsMap> supportDimMapMap;

好的,让我解释一下这些东西……pattern是字符串的向量。对于“较小的” map 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而我没有不知道为什么...

任何建议或解释将不胜感激!谢谢!!

4

4 回答 4

2
dimPatternsMap currDpm = currReverseMap[support];

currDpmcurrReverseMap[support]. 它不是同一个对象。因此,当您对 进行更改时currDpm,不会发生任何currReverseMap更改。

另一方面,如果您使用参考:

dimPatternsMap& currDpm = currReverseMap[support];

thencurrDpmcurrReverseMap[support]真的是同一个对象,所以后面的语句 usingcurrDpm真的会改变currReverseMap.

在其他一些地方,您的代码也可以从引用中受益。

于 2013-11-02T23:43:53.430 回答
2

我的猜测:您应该在 else 中使用参考:

dimPatternsMap& currDpm = currReverseMap[support];

您当前的代码会创建一个副本,而不是使用原始地图。

于 2013-11-02T23:44:05.667 回答
1

你的问题是这一行:

dimPatternsMap currDpm = currReverseMap[support];

根据它后面的代码,它想这样读:

dimPatternsMap& currDpm = currReverseMap[support];

没有&您修改条目的副本而不是现有条目。

于 2013-11-02T23:44:29.340 回答
1

您的代码正在制作下面的对象的多个副本,请尝试使用更多引用和迭代器(find()例如,如果找到它,则已经为您提供了一个元素)。

例如,dimPatternsMap currDpm = currReverseMap[support];实际上在您的结构中制作地图的副本并向其添加元素(而不是原始元素)。尝试使用参考。

于 2013-11-02T23:45:29.190 回答