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

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/

    10-12 15:05