与.txt中数据的统计有关解决思路

与.txt中数据的统计有关
有一组数据的.txt文件,上万行,如下形式:
3 1
3 1
2 1
2 2
2 2
2 2
2 1
2 1
3 2
1 1
2 1
2 1
1 1
1 1
目的是统计出1 1的个数n1,
1 2和2 1的个数总和n2,
1 3和3 1的个数总和n3.....
1 5和5 1的个数总和n5
2 2的个数n6
2 3和3 2的个数总和n7
...........
(这里1 2和2 1,1 3和3 1看做是相同的),然后求每组的个数占总数的比例,如:总和为n=n1+n2+n3+...,比例为n1/n,n2/n.....


------解决方案--------------------
感觉用map可以实现
一个思路:
写入map时,用串表示,"1 1","1 3"作为map的string值,并设一个int作为map的另一项
若读入"3 1",时,对换变成"1 3"(比较前后大就可以了)
有关map的统计方法,看以前我回过你的贴
http://topic.****.net/u/20100423/20/de5e9b70-dc9c-4f6a-87e2-b57871150bbf.html

------解决方案--------------------
可以变换一次,把前后两个数的和 跟差的绝对值取出来,值相同的可以累加1.然后统计。如:1 3的和是4 差绝对值是2;3 1的和同样是4 差的绝对值也是2
------解决方案--------------------
粗略写了个,数据的位数可以不受限。
但数据之间的分隔只能用一个空格。
C/C++ code
#include <iostream>
#include <fstream>
#include <string>
#include <map>
#include <iomanip>
using namespace std;

int main()
{
    map<string,int> myMap;  // 数据字符串及对应个数
    ifstream infile("data.txt");
    string tmp; // 每行读取的临时字符串
    int count = 0;  // 总行数
    while(getline(infile,tmp))
    {
        size_t pos = tmp.find(' '); // 找到空格的位置
        string str1 = tmp.substr(0,pos); // 切割出第一个数
        string str2 = tmp.substr(pos+1,tmp.size()); // 切割出第二个数
        string tmpStr1 = str1+ " " +str2;
        string tmpStr2 = str2+ " " +str1;
        // 检查记录是否已经存在并增加其计数
        if(myMap.end()!=myMap.find(tmpStr1))
        {
            myMap[tmpStr1]++;
            count++;
        }
        else
        {
            myMap[tmpStr2]++;
            count++;
        }
    }
    map<string,int>::iterator iter;
    for(iter = myMap.begin();iter!=myMap.end();iter++) // 遍历并输出数据及其对应比例
    {
        cout << "data: " << setw(10) << iter->first << " ";
        cout << "count: " << setw(5) << iter->second << " ";
        cout << "scale: " << (double)iter->second/count << endl;
    }

    infile.close();
    return 0;
}