2011-11-29 126 views
2

我想创建一个结构,它包含不同的字符串,并为它们中的每一个分配一些(而不是一个唯一的)int值。在填充了这个结构之后,我想检查每个字符串有多少不同的int分配给了它们,以及它们究竟是哪一个。我知道可以用multimap解决这个问题。然而,我不确定是否有可能将所有不同的字符串包含到multimap中,因为函数“find”需要一个匹配参数,而我不知道何时可以搜索哪些不同的值多重映射。这怎么能用multimap来完成?C++在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 
     } 
    } 

} 

任何人都可以检测到问题?第一种方式还是第二种方式有没有可行的解决方案?

+1

不应该在for循环中使用'* it'而不是'it->'吗? – Viruzzo

+0

你的示例是一个非常糟糕的设计,试着用一个函子来使用stl like for_each – melbic

回答

4

什么是it->?这是矢量,如果int s,你可能想要*it

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

1

我建议一个multimap<string, int>。假设我正确理解了你的要求,你有“独特的”字符串和几个不同的值。您可以使用count(key)来查看关键字有多少个值,equal_range(key)返回pair<interator, iterator>,第一个迭代器指向键的值范围的开始,第二个迭代器指向键的值。

reference

1

好吧,这是完全以效率不高的,但是你可以使用std ::你初始化设置的std ::载体,在此只提取的std ::载体的独特的价值观,像例如:

#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