映射对的矢量

时间:2013-10-27 20:24:30

标签: c++ vector map std-pair

我有点问题。 我有一对对的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

3 个答案:

答案 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);