2016-12-14 49 views
0

我有一個包含10000行2的IP地址 「129.151.102.150 119.128.105.153」什麼是打印出無序地圖的好方法?

什麼,這代表的是第一個IP地址與正確的等連接的大量文本文件。在這個文本文件中有多次連接的IP地址。所以我想要做的就是打印出連接最多的前10個IP地址。我的方法就是用這種方式在無序地圖中填充文本文件的內容。然後我創建了一個結構,其中包含該任務所需的所有數據。然後我還創建了一個類priority_queue的對象。我的問題是,當我試圖把它打印出來它這樣做,但只有相同的IP地址顯示出來,例如10倍控制檯窗口輸出顯示「129.151.102.150:1」 10次,其中1代表,它連接一次。

struct data_pq 
{ 
    string key; 
    unordered_map<string, char> v; 

    data_pq() 
    { 
     key = ""; 
    } 
    data_pq(string key, unordered_map<string, char> v) 
    { 
     this->key = key; 
     this->v = v; 
    } 
    friend bool operator<(const data_pq& leftop, const data_pq& rightop) 
    { 
     return leftop.v.size() < rightop.v.size(); 
    } 


}; 

class kommunikation3_3{ 
private: 

unordered_map<string, unordered_map<string, char>> m; 
priority_queue<data_pq>pq; 

public: 
kommunikation3_3(){} 
~kommunikation3_3(){} 

void readfile(string file_name) 
{ 
    ifstream fin(file_name); 
    string strRow; 

    while (getline(fin, strRow)) 
    { 
     istringstream iss(strRow); 
     string ip1, ip2; 

     getline(iss, ip1, ' '); 
     getline(iss, ip2); 

     //vad gör de här två rader????????????? 
     m[ip1][ip2]; 
     m[ip2][ip1] = '-'; 

     fin.close(); 
    } 

    //Denna loop pushar information om första o andra deleln: 
    for (auto it = m.begin(); it != m.end(); ++it) 
    { 
     pq.push(data_pq(it->first, it->second)); 
    } 
} 


void print(int n) 
{ 
    for (size_t i = 0; i < n; i++)//n=10 
    { 
     cout << pq.top().key << ":" << pq.top().v.size() << endl; 
    } 

    pq.pop(); 
} 
}; 

我主要看起來像這樣

cout << "top ten connections" << endl; 
kommunikation3_3 m; 

m.readfile("ip3.txt"); 
m.print(10); 
+1

你'for'循環打印這樣的: 「COUT << pq.top()鍵<< 」:「 << pq.top()v.size()<< ENDL;」。沒有什麼會使用循環索引變量'size_t i',因爲它總是會在循環的每次迭代中打印相同的內容。你的整體邏輯很糾結,所以不清楚循環應該打印什麼,但這就是爲什麼你每次都看到相同的東西打印。 –

回答

0

在您print功能pqfor循環並未修改,這就是爲什麼你得到同樣的事情10倍。將pq.pop()移入循環。

+0

謝謝!我被困住了。 readfile函數也很奇怪,但我設法改變它。 –

相關問題