我有一个文本文件:
a 1 b 6 e 4 h 2
r 5 q 1 a 2 e 2 b 3
高达300k线。每个字符都跟着它的价值。我想逐行读取这个文件,并在同一行中的每个2个字符之间进行配对。第一行的结果:
(a,b)
(a,e)
(a,h)
(b,e)
(b,h)
(e,h)
我也计算每对的频率。代码:
using namespace std;
std::map<std::pair< char, int>, int> CharP;
struct Mydata
{
char myString;
float value;
friend std::istream &operator>>(std::istream &is, Mydata &d) {
{
string line;
std::getline(is,line);
return is >> d.myString>> d.value;
}
};
int main()
{
std::ifstream in("Data.txt");
std::vector<Mydata> data{ std::istream_iterator<Mydata>(in), std::istream_iterator<Mydata>() };
for (std::vector<Mydata> ::iterator current = data.begin(); current != data.end(); ++current)
{
char a = current->myString;
for (std::vector<Mydata> ::iterator current2 = ++current; current2 != data.end(); ++current2)
{
char b = current2->myString;
auto itt = CharP.find(std::make_pair(b, a));
++CharP[(itt != CharP.end()) ? std::make_pair(b, a) : std::make_pair(a, b)];
}
--current;
}
cout << " \nPress any key to continue\n";
system("PAUSE");
return 0;
}
我收到了这个错误: 二进制'&gt;&gt;' :找不到哪个运算符采用'Mydata'类型的右手操作数(或者没有可接受的转换)。
我有另一个问题,因为我有大文件,我想知道是否有另一种方法比附加代码更快。
答案 0 :(得分:3)
如果没有查看剩下的代码,我想我可以放心地说这就是问题所在:
friend std::istream& getline(std::istream &is, Mydata &d)
您是否打算在此声明中重载提取器?如果是这样,您应该知道提取器是运算符,即operator>>()
。将getline
替换为>>
:
friend std::istream& operator>>(std::istream &is, Mydata &d);
此外,非常不可读:
++CharP[(itt != CharP.end()) ? std::make_pair(b, a) : std::make_pair(a, b)];
替换为:
if (itt != CharP.end()) { auto p = std::make_pair(b, a); ++CharP[p]; } else { auto p = std::make_pair(a, b); ++CharP[p]; }