C++:使用映射作为另一个映射的值

c++: use map as value of another map

本文关键字:映射 另一个 C++      更新时间:2023-10-16

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

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];

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

另一方面,如果使用引用:

dimPatternsMap& currDpm = currReverseMap[support];

那么currDpmcurrReverseMap[support]确实是同一个对象,所以后面使用 currDpm 的语句实际上会改变 currReverseMap 中的值。

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

我的猜测:你应该在你的else中使用一个引用:

dimPatternsMap& currDpm = currReverseMap[support];

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

你的问题是这一行:

dimPatternsMap currDpm = currReverseMap[support];

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

dimPatternsMap& currDpm = currReverseMap[support];

如果没有&则修改条目的副本而不是现有条目。

你的代码正在制作下面的对象的多个副本,尝试使用更多的引用和迭代器(例如,如果找到元素,find()已经给你一个元素)。

例如,dimPatternsMap currDpm = currReverseMap[support];实际上在您的结构中复制地图并向其添加一个元素(而不是原始元素)。请尝试改用引用。