c++ - 如何计算结构 vector (这是一个类成员,使用提取运算符)

标签 c++ vector operator-overloading extraction

我正在尝试使用重载的提取运算符简单地计算 vector 的元素。 vector contians Point,它只是一个包含两个 double 的结构。 vector 是一个名为 Polygon 的类的私有(private)成员,所以这是我的 Point.h

#ifndef POINT_H
#define POINT_H
#include <iostream>
#include <string>
#include <sstream>
struct Point
{
  double x;
  double y;
  //constructor
  Point()
  {
   x = 0.0;
   y = 0.0;
  }

friend std::istream& operator >>(std::istream& stream, Point &p)
    {
    stream >> std::ws;
    stream >> p.x;
    stream >> p.y;
    return stream;
    }
friend std::ostream& operator << (std::ostream& stream, Point &p)
{
stream << p.x <<  p.y;
return stream;
}    
};
#endif

我的多边形.h

#ifndef POLYGON_H
#define POLYGON_H
#include "Segment.h"
#include <vector>
class Polygon
{
    //insertion operator needs work
 friend std::istream & operator >> (std::istream &inStream, Polygon &vertStr);
 // extraction operator
 friend std::ostream & operator << (std::ostream &outStream, const Polygon &vertStr);

   public:
   //Constructor
    Polygon(const std::vector<Point> &theVerts);
    //Default Constructor
    Polygon();
    //Copy Constructor
    Polygon(const Polygon &polyCopy);
      //Accessor/Modifier methods
    inline std::vector<Point> getVector() const {return vertices;}
    //Return number of Vector elements
    inline int sizeOfVect() const {return vertices.size();}
    //add Point elements to vector
    inline void setVertices(const Point &theVerts){vertices.push_back (theVerts);}

 private:
std::vector<Point> vertices;
};

和 Polygon.cc

using namespace std;
 #include "Polygon.h"
// Constructor
Polygon::Polygon(const vector<Point> &theVerts)
    {
        vertices = theVerts;
    }
 //Default Constructor
Polygon::Polygon(){}

istream & operator >> (istream &inStream, Polygon::Polygon &vertStr)
 {
    inStream >> ws;
    inStream >> vertStr;
    return inStream;
 }

// extraction operator
 ostream & operator << (ostream &outStream, const Polygon::Polygon &vertStr)
{
    outStream << vertStr.vertices << endl;
    return outStream;
 }

我认为我的点插入/提取是正确的,我可以使用它进行插入和计算

我想我应该能够……

cout << myPoly[i] << endl;  

在我的驱动程序中? (在一个循环中)甚至...

cout << myPoly[0] << endl; 

没有循环? 我已经尝试了各种

myPoly.at[i];
myPoly.vertices[i];

等等等等

还在我的提取函数中尝试了所有版本

outStream << vertStr.vertices[i] << endl;

内循环等

当我刚刚创建一个...

vector<Point> myVect;

在我的驱动程序中我可以...

cout << myVect.at(i) << endl;

没问题。

试图找到几天的答案,真的迷失了,而不是因为缺乏尝试!

请原谅我缺少注释和格式 也有遗漏的点点滴滴。

最佳答案

让事情井井有条。一、术语:operator<<是一个插入运算符——它将项目插入到流中。 operator>>是一个提取运算符——它从流中提取项目。

其次,您的插入运算符存在一些相当严重的问题。让我们从底部开始,point::operator<< .现在你有:

friend std::ostream& operator << (std::ostream& stream, Point &p)
{
    stream << p.x <<  p.y;
    return stream;
} 

现在,让我们考虑一下当我们向其输入一些实数时会发生什么,比如 1.23 和 4.56。它会写出:

1.234.56

这显然是个问题。没有办法通过查看数据本身来找出“x”结束和“y”开始的位置。我们需要格式化数据,以便我们能够区分它们:

std::ostream &operator<<(std::ostream &stream, Point const &p) { 
    return stream << p.x << " " << p.y;
}

另请注意,由于我们不打算修改传递的点,因此我已将其更改为 const引用。

当/如果您尝试在一个文件中存储多个多边形时,您会再次遇到同样的问题——您有一个顶点流,但没有显示哪些顶点属于哪些多边形。例如,一个正方形后面跟着一个三角形可能如下所示:

0 0
1 0
1 1
0 1
1 1
2 2
0 2

处理这个问题的一个明显方法是在每个多边形前面加上它包含的顶点数,因此相同的数据看起来像这样:

4
0 0
1 0
1 1 
0 1
3
1 1
2 2 
0 2

然后我们可以在读回原始多边形时重新生成它们。为此,我们(显然)需要适本地编写我们的运算符:

std::ostream &operator<<(std::ostream &os, Polygon const &p) {
    std::vector<Point> v = p.getVector();
    os << v.size << "\n";

    // write each point out using operator<< for Point:
    std::copy(v.begin(), v.end(), std::ostream_iterator<Point>(os, "\n"));
    return os;
}

std::istream &operator>>(std::istream &is, Polygon &p) {     
    size_t size;
    is >> size;
    Point temp;
    for (int i=0; i<size; i++) {
        is >> temp;
        p.setVertices(temp);
    }
    return is;
}

看看这需要多长时间,我想我现在就到此为止。

关于c++ - 如何计算结构 vector (这是一个类成员,使用提取运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585621/

相关文章:

c++ - 'make_shared' 不明确

c++ - 有类似 is_empty_but_has_virtual_functions 的东西吗?

Java Vector<int[]> int[] 的引用还是复制?

c++ - 非常基本的 std::vector 迭代

c++ - 对 sprintf 可变参数使用一个指针

c++ - QTableView:动态更改 rowCount

c++ - 迭代 vector 时扩展 vector

python - 在 python 类上重写 __or__ 运算符

c++ - 为什么 C++ 运算符重载需要 "having at least one parameter of class type"?

Python 运算符重载和运算符结合性