2011-11-29 128 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