C++:使用映射作为另一个映射的值
c++: use map as value of another map
我只是想知道我是否可以使用一个"复杂"的地图作为另一个地图的值。我自定义了几个结构,如下所示:
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];
currDpm
是currReverseMap[support]
的副本。 它不是同一个对象。 因此,当您对currDpm
进行更改时,currReverseMap
中的任何内容都不会更改。
另一方面,如果使用引用:
dimPatternsMap& currDpm = currReverseMap[support];
那么currDpm
和currReverseMap[support]
确实是同一个对象,所以后面使用 currDpm
的语句实际上会改变 currReverseMap
中的值。
在其他一些地方,您的代码也可以从引用中受益。
我的猜测:你应该在你的else中使用一个引用:
dimPatternsMap& currDpm = currReverseMap[support];
您当前的代码将创建副本,而不是使用原始地图。
你的问题是这一行:
dimPatternsMap currDpm = currReverseMap[support];
根据它后面的代码,它想要读成这样:
dimPatternsMap& currDpm = currReverseMap[support];
如果没有&
则修改条目的副本而不是现有条目。
你的代码正在制作下面的对象的多个副本,尝试使用更多的引用和迭代器(例如,如果找到元素,find()
已经给你一个元素)。
例如,dimPatternsMap currDpm = currReverseMap[support];
实际上在您的结构中复制地图并向其添加一个元素(而不是原始元素)。请尝试改用引用。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 打印对象的映射,其中另一个对象作为键
- 将整数范围映射到另一个范围
- 如何将键和值从映射传输到另一个映射?
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- 如何将映射从类构造函数传递到类中的另一个函数
- 将映射从第二个元素复制到另一个地图
- c++存储映射元组的引用,以便在另一个函数中使用
- 将映射的每个键中的数字数据与另一个数值进行比较
- 在函数模板中将一个类型名映射到另一个类型名
- 一行 std::vector ctor 来自映射另一个向量
- 将一个映射插入到同一多重映射的另一个映射中会导致 SEG 错误
- C 将HEAP对象插入std ::用insert()插入映射,而另一个则存在删除新的对象
- 将映射从字符串到INT的最佳方法,而另一个同时进行的方式
- 如何将std ::映射的第一个N元素复制到另一个地图
- 如何将记忆映射的文件与另一个进程写入文件同步
- 如何将映射的内容从一个类复制到另一个类的新向量中