如何测试自反、对称或传递

How can I test for reflexive, symmetric, or transitive

本文关键字:对称 何测试 测试      更新时间:2023-10-16

我必须在代码中使用此结构:

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;
    

    现在,当我在istream_iterator<Pair>上调用 copy_n 算法时,这就是下面的代码隐执行的操作(即它以与我刚才展示的完全相同的方式提取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";
    }
}

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)