2010-10-10 193 views
1

我想解決這個問題:Search multiple list for missing entries。我用一個multimap來複制密鑰。這裏是我的代碼:將兩個列表合併成一個列表

#include <iostream> 
#include <map> 
#include <list> 
#include <utility> 
using namespace std; 
int main(){ 

    list<char>a; 
    list<int> b; 
    multimap<char,int>s; 
    a.push_back('A'); 
    a.push_back('B'); 
    a.push_back('C'); 
    b.push_back(1); 
    b.push_back(2); 
    b.push_back(3); 
    s.insert(std::pair<char,int>('A',1)); 
    s.insert(std::pair<char,int>('A',2)); 
    s.insert(std::pair<char,int>('B',2)); 
    s.insert(std::pair<char,int>('B',3)); 
    s.insert(std::pair<char,int>('C',1)); 
    s.insert(std::pair<char,int>('C',3)); 
    list<char>::iterator it; 
    list<int>::iterator IT; 
    multimap<char,int>::iterator i; 
    for (i=s.begin();i!=s.end();i++){ 
     for (IT=b.begin();IT!=b.end();IT++){ 
      i=s.find(*IT); 
      if (i==s.end()){ 
       cout<<(*i).first<< " "<<*IT<<endl; 
      } 
     } 
    } 

    return 0; 
} 

它編譯但我運行後,其異常停止運行。我想我沒有正確地訪問元素。請幫幫我。 編輯: 我已經更新了我的代碼

#include <iostream> 
#include <map> 
#include <list> 
#include <utility> 
using namespace std; 
int main(){ 

    list<char>a; 
    list<int> b; 
    multimap<char,int>s; 
    a.push_back('A'); 
    a.push_back('B'); 
    a.push_back('C'); 
    b.push_back(1); 
    b.push_back(2); 
    b.push_back(3); 
    s.insert(std::pair<char,int>('A',1)); 
    s.insert(std::pair<char,int>('A',2)); 
    s.insert(std::pair<char,int>('B',2)); 
    s.insert(std::pair<char,int>('B',3)); 
    s.insert(std::pair<char,int>('C',1)); 
    s.insert(std::pair<char,int>('C',3)); 
    list<char>::iterator it; 
    list<int>::iterator IT; 
    multimap<char,int>::iterator i; 
    for (it=a.begin();it!=a.end();it++){ 
    for (i=s.begin();i!=s.end();i++){ 
     for (IT=b.begin();IT!=b.end();IT++){ 

      if ((*i).first==*it && ((*i).second!=*IT)){ 

       cout<<(*i).first<< " "<<*IT<<endl; 


      } 


     } 
    } 
    } 
     return 0; 

} 

但這裏實在是太多了組合的話,我需要那麼是什麼問題,我認爲它應該工作正常

回答

3

你的問題就在這裏:

if (i==s.end()){ 
    cout<<(*i).first<< " "<<*IT<<endl; 
} 

如果我是s.end(),您無法再訪問它。這意味着它是無效的。 你需要檢查它沒有s.end()

if(i != s.end()) 

這是你崩潰的原因。不過,我的問題理解你打算爲如何解決問題提供更好的建議。

編輯:

一個解決問題的辦法可能是這樣的:

#include <map> 
#include <set> 
#include <iostream> 

struct d { 
    char c; 
    int i; 
}; 

int main() 
{ 
    d data[] = { 
     { 'A', 1 }, 
     { 'A', 2 }, 
     { 'B', 2 }, 
     { 'B', 3 }, 
     { 'C', 1 }, 
     { 'C', 3 } 
    }; 

    std::map< char, std::set<int> > data_map; 
    for(size_t i = 0; i < sizeof(data)/sizeof(d); ++i) { 
     data_map[ data[i].c ].insert(data[i].i); 
    } 

    for(char c = 'A'; c < 'D'; ++c) { 
     for(int i = 1; i < 4; ++i) { 
      if(data_map[c].count(i) == 0) { 
       std::cout << c << " " << i << " is missing" << std::endl; 
      } 
     } 
    } 

    return 0; 
} 

輸出:

 
A 3 is missing 
B 1 is missing 
C 2 is missing 
1

只是一些提示入手 -

運行代碼一個調試器(VS 2008 express是免費的) - 執行代碼,檢查變量,並且你應該看到什麼是錯誤的。

重命名你的迭代器,以便更清楚你想要做什麼 - 我,它和IT只是導致混淆。

最後 - 寫出你正在嘗試編碼之前做的事情 - 這樣

For (all letters) 
{ 
    For (all numbers) 
    { 
     if (letter,number not in map) 
     print out missing (letter, number) 
    } 
}