打印出无序地图的好方法是什么?

时间:2016-12-14 11:58:50

标签: c++ c++11

我有一个包含10000行2个ip地址的大文本文件 " 129.151.102.150 119.128.105.153"

这代表的是第一个ip地址与右边的IP地址连接,依此类推。在此文本文件中,有多个已连接的IP地址。所以我要做的就是打印出连接最多的前10个ip地址。我的方法是这样我在无序映射中填充文本文件的内容。然后我创建了一个 struct ,其中包含该任务所需的所有数据。然后我还创建了一个类 priority_queue 的对象。我的问题是,当我尝试将其打印出来时,它会这样做,但只有相同的IP地址显示10次,例如控制台窗口中的输出显示 " 129.151.102.150:1& #34; 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 个答案:

答案 0 :(得分:0)

for函数print内的pq循环内部未被修改,这就是为什么你会得到10次同样的东西。将pq.pop()移动到循环中。