我必须在代码中使用此结构:
struct Pair
{
int x,y;
friend bool operator==(Pair a, Pair b)
{
return a.x == b.x && a.y == b.y;
}
friend istream& operator>>(istream& is, Pair& a)
{
is >> a.x >> a.y;
return is;
}
friend ostream& operator<<(ostream& os, Pair a)
{
os << '(' << a.x << ',' << a.y << ')';
return os;
}
};
我需要阅读一个.txt文件:
5 1 1 2 2 3 3 4 4 5 5
7 1 1 2 2 3 3 4 4 4 7 7 4 7 7
8 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64
该文件中具有3个关系,每个关系都以一个int开头,该整数是该关系中对的数量,然后是许多对。然后(如果不是eof)再次读取另一个int和那么多对,依此类推。
如何将这些数据读入我的结构对中?
阅读后,我将不得不测试数据是否自反,等等,但是我在开始这个项目时遇到了麻烦。
最佳答案
这就是我要写的。
我知道我对此的看法可能有点“高级”-但至少它应该向您显示所需的代码确实并不多。
关于一点解释:
使用字符串流(istringstream
)的
friend
流运算符(尤其是operator>>
)将使您可以“简单”地从流中读取一对,方法很简单:Pair p;
stream >> p;
现在,这就是当我在
copy_n
上调用istream_iterator<Pair>
算法时,下面的代码隐式地执行的操作(即,它以与我刚演示的完全相同的方式提取Pair
)。 using Pairs = vector<Pair>;
int main()
{
string line;
while (getline(cin, line))
{
istringstream iss(line);
unsigned n;
Pairs pairs;
if (iss >> n)
copy_n(istream_iterator<Pair>(iss), n, back_inserter(pairs));
if (!iss)
return 255;
std::cout << "Read a line with " << n << " pairs (check: " << pairs.size() << ")\n";
}
}
将其与问题的示例输入一起显示为 Live on Coliru ,并打印:
Read a line with 5 pairs (check: 5)
Read a line with 7 pairs (check: 7)
Read a line with 8 pairs (check: 8)
关于c++ - 如何测试自反,对称或可传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19415372/