我有点问题。
我有一对对的patternOccurences。对是<string,int>
,其中string是模式(name),int是它出现的索引。我的问题是patternOccurences有多个具有相同.first(相同模式)但不同int值的对。
例如:向量有10个条目。图5中的模式“a”和5的模式“b”。都有不同的指数。现在我想要一个地图(或类似的东西),以便我有一个矢量/列表,每个模式(在我的例子中为“a”和“b”)作为键,其索引的矢量作为值。索引在我的向量对中的不同对中,我希望int向量中的模式“a”的所有索引作为键“a”的值。
我尝试了以下内容:
std::map<std::string,std::vector<int>> occ;
for(int i = 0;i<patternOccurences.size();i++){
if(occ.find(patternOccurences.at(i).first)==occ.end()){
occ[patternOccurences.at(i).first]=std::vector<int>(patternOccurences.at(i).second);
}
else{
occ[patternOccurences.at(i).first].push_back(patternOccurences.at(i).second);
}
}
patternOccurences是对的向量,并且是所需的映射。首先,我检查是否已经存在字符串(模式)的条目,如果没有,我创建一个带有向量的值作为值。如果已经存在,我尝试用索引推送向量。然而它似乎没有正常工作。对于第一个模式,我得到一个只有0作为值的向量,而对于第二个模式,只有3个索引是正确的,而其他索引也是0。
我希望你能帮助我。 Kazoooie
答案 0 :(得分:2)
您以错误的方式呼叫constructor for the vector
:
std::vector<int>(patternOccurences.at(i).second);
这会创建一个包含N个默认构造元素的向量,而不是带有一个值为N的元素的向量。您需要:
std::vector<int>(1, patternOccurences.at(i).second);
这应该解决问题,但你的代码不必那么复杂。以下工作正常:
for(int i = 0;i<patternOccurences.size();i++){
occ[patternOccurences.at(i).first].push_back(patternOccurences.at(i).second);
}
或使用C ++ 11,更简单:
for(auto& p:patternOccurences) {
occ[p.first].push_back(p.second);
}
答案 1 :(得分:0)
你要求的内容已经存在于STL中,它被称为std::multimap
(和std::unordered_multimap
)。
看看here。基本上它是一个允许更多值具有相同键的映射。
std::multimap<std::string, int> occ;
occ.insert(std::pair<std::string,int>("foo", 5));
occ.insert(std::pair<std::string,int>("foo", 10));
std::pair<std::multimap<std::string,int>::iterator, std::multimap<std::string,int>::iterator> group = occ.equal_range("foo");
std::multimap<std::string,int>::iterator it;
for (it = ret.first; it != ret.second; ++it) {
..
}
答案 2 :(得分:0)
更改此声明
occ[patternOccurences.at(i).first]=std::vector<int>(patternOccurences.at(i).second);
到
occ[patternOccurences.at(i).first]=std::vector<int>(1, patternOccurences.at(i).second);