make_pair for vector <vector <struct>&gt; </vector <struct>

时间:2014-01-27 05:53:47

标签: c++ vector

我有这种格式的文件:

id1   its_vlaue1   id2   its_vlaue2   id3   its_vlaue3 
id4   its_vlaue4   id5   its_vlaue5
id6   its_vlaue6   id7   its_vlaue7   id8   its_vlaue8 

其中id是整数,its_vlaue是float,例如:

100 0.1 2 0.6 9 0.03
4 0.6 3 0.1
.
.
until 300k line

我将此文件读作:

struct dataf
{
    int id;
    float value;
};
vector<vector<dataf>> mydata;  
dataf DF; 

void main()
{

    ifstream inFile;
    inFile.open("MyData.txt");
    if (inFile.fail())
        cout << "\n The file has been not found, please try again \n ";
    else
    {
        string line;
        cout << "\n File found!\n Reading the file data! \n\n";

        // Read the file until EOF

        while (!inFile.eof())
        {           
            getline(inFile, line); 
            std::stringstream Sline(line); 

            while (Sline >> DF.id>> DF.value)
            {               
                vector<dataf>  temp;
                temp.push_back(DF);
                mydata.push_back(temp); 
            }

        }

    }
    inFile.close();

    PairS();

    cout << " \nPress any key to continue\n";
    cin.ignore();
    cin.get();

    return;
}

PairS()函数make_pair,以便:

(id1,id2), (id1,id3), (id2,id3)
(id4,id5)
(id6,id7), (id6,id8), (id7,id8)

但是,我无法弄清楚

void PairS()
    {
        vector<dataf>::iterator i;
        vector<dataf>::iterator j;
           std::map<std::pair< int, int>, float> Pairf;

        for (int k = 0; k != ((mydata.size()) - 1); ++k)
        {

        for (i = mydata[k].begin(); i != mydata[k].end(); ++i)
        {
            int a = (*i).Item;

            for (j = mydata[k + 1].begin(); j != mydata[k+1].end(); ++j)
            {

                int b =(*j).Item;
                auto itt = Pairf.find(std::make_pair(b, a));
                ++Pairf[(itt != Pairf.end()) ? std::make_pair(b, a) : std::make_pair(a, b)];

            }

        }
        }

        cout << "\n\n The TotalSupp's Count for every Pair of Items :\n\n";
        for (const auto& p : Pairf)
        {
            std::cout << "(" << p.first.first << " " << p.first.second << ") = "
                << p.second << '\n';
        }

        cout << "\n";

}

另外,我不确定我是否选择了合适的方法将数据存储在矢量中。

1 个答案:

答案 0 :(得分:1)

对于第一部分(只是从文件中读取数据),我可能会这样做:

struct dataf
{
    int id;
    float value;

    friend std::istream &operator>>(std::istream &is, dataf &d) { 
        return is >> d.id >> d.value;
    }
};

// ...

std::ifstream in("yourfile.dat");

// read data from file to vector
std::vector<dataf> data{std::istream_iterator<dataf>(in),
                        std::istream_iterator<dataf>()};

至少如果我正确地阅读了PairS,您似乎只想要唯一的项目。如果您想要(或至少不反对)在流程中排序的数据,您可以更轻松地删除重复项:

std::sort(data.begin(), data.end());
data.erase(std::unique(data.begin(), data.end()), data.end());

如果您需要维护原始订单,可以执行以下操作:

std::unordered_set unique;
std::vector<dataf> data;

std::copy_if(std::istream_iterator<dataf>(in),
             std::istream_iterator<dataf>,
             std::back_inserter(data),
             [&](dataf const &d) { return unique.insert(d).second; });

这里的基本思想是,当每个项目被阅读时,它会尝试将该项目插入unordered_set。我们将if复制到成功的向量iff,这表示之前没有看到它。