我有这种格式的文件:
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";
}
另外,我不确定我是否选择了合适的方法将数据存储在矢量中。
答案 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,这表示之前没有看到它。