0

我有一个小问题。我有一个成对模式出现的向量。对是<string,int>,其中 string 是模式(名称), int 是它出现的索引。我的问题是 patternOccurences 有多对具有相同的 .first(相同模式)但不同的 int 值。例如:向量有 10 个条目。模式“a”的 5 个和模式“b”的 5 个。都有不同的指标。现在我想要一个地图(或类似的东西),这样我就有一个向量/列表,每个模式(在我的例子中是“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 是对的向量,并 occ 所需的地图。首先,我检查是否已经有字符串(模式)的条目,如果没有,我创建一个以向量作为值的条目。如果已经有一个,我尝试用索引 push_back 向量。但是,它似乎无法正常工作。对于第一个模式,我得到一个仅作为值的向量,对于第二个模式,只有 3 个索引是正确的,其他索引也是 0。

我希望你能帮助我。卡祖伊

4

3 回答 3

2

您以错误的方式调用构造函数: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);
}
于 2013-10-27T20:30:49.197 回答
0

您所要求的已经存在于 STL 中,它被称为std::multimap(and std::unordered_multimap)。

看看这里。基本上它是一个允许更多值具有相同键的映射。

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) {
 ..
}
于 2013-10-27T20:28:12.200 回答
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);
于 2013-10-27T20:33:50.887 回答