c ++:使用map作为另一个map的值

时间:2013-11-02 23:31:51

标签: c++ vector map text-mining stdmap

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

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并且我不会不知道为什么......

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

4 个答案:

答案 0 :(得分:2)

dimPatternsMap currDpm = currReverseMap[support];

currDpmcurrReverseMap[support]的副本。它不是同一个对象。因此,当您对currDpm进行更改时,currReverseMap内的任何内容都不会更改。

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

dimPatternsMap& currDpm = currReverseMap[support];

然后currDpmcurrReverseMap[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];实际上会在您的结构中制作地图的副本,并为其添加元素(而不是原始元素)。请尝试使用引用。