C ++在multimap中查找键和值

时间:2011-11-29 10:38:14

标签: c++ vector map iterator

我想创建一个包含不同字符串的结构,并为每个字符串分配一些(不是唯一的)int值。在我填充了该结构之后,我想检查每个字符串已经分配了多少个不同的int以及它们究竟是哪个。我知道可以通过multimap解决这个问题。但是我不确定是否(或如何)可以将所有不同的字符串包含在multimap中,因为函数“find”需要一个参数进行匹配,而我不知道何时搜索哪些不同的值可能在多重映射。怎么可以用multimap完成?

作为替代解决方案,我尝试使用带矢量作为值的简单地图。但是我仍然无法使这个工作,因为向量的迭代器似乎没有被识别,它表明我:迭代器必须有一个指向类类型的指针。

map<string, vector<int>>::iterator multit;
int candID1, candID2, candID3;

for(multit=Freq.begin(); multit!=Freq.end(); multit++)
{
    if((*multit).second.size()==3)
    {
        vector<int> vectorWithIds = (*multit).second;

        for(vector<int>::iterator it = vectorWithIds.begin();
            it != vectorWithIds.end();it++)
        {
            candID1 = it->        Problem: The iterator is not recognized
        }
    }

}

有人能检测到这个问题吗?无论是第一种还是第二种方式,都有可行的解决方案吗?

3 个答案:

答案 0 :(得分:4)

什么是it->?它是int s的向量,您可能需要*it

P.S。我不得不承认我没有阅读整篇散文。

答案 1 :(得分:1)

我建议multimap<string, int>。假设我正确地理解了您的要求,并且您拥有&#34; unique&#34;字符串和几个不同的值。您可以使用count(key)查看密钥的值,equal_range(key)返回pair<interator, iterator>,其中第一个迭代器指向键的值范围的开始,第二个迭代器指向键的值。

请参阅reference

答案 2 :(得分:1)

好吧,这完全没有效率,但你可以使用std :: set initialize和std :: vector一起提取std :: vector的唯一值,就像这个例子一样:

#include <iostream>

#include <vector>
#include <map>
#include <set>

int main() {
    // some data
    std::string keys[] = {"first", "second", "third"};
    int values[] = {1, 2, 1, 3, 4, 2, 2, 4, 9};

    // initial data structures
    std::vector<std::string> words(keys, keys + sizeof(keys) / sizeof(std::string));
    std::vector<int> numbers(values, values + sizeof(values) / sizeof(int));

    // THE map
    std::map< std::string, std::vector<int> > dict;

    // inserting data into the map
    std::vector<std::string>::iterator itr;
    for(itr = words.begin(); itr != words.end(); itr++) {
        dict.insert(std::pair< std::string, std::vector<int> > (*itr, numbers));
    } // for

    // SOLUTION
    // count unique values for the key of std::map<std::string, std::vector<int> >
    std::map<std::string, std::vector<int> >::iterator mtr;
    for(mtr = dict.begin(); mtr != dict.end(); mtr++) {
        std::set<int> unique((*mtr).second.begin(), (*mtr).second.end());
        std::cout << unique.size() << std::endl;
    } // for

    return 0;
} // main
相关问题