C++ c++;带ostream和istream的向量

C++ c++;带ostream和istream的向量,c++,vector,istream,C++,Vector,Istream,我曾经有过一段我无法理解的代码。前提是输入一组数字:3 4 5 6 7,然后使用istream和ostream输出:4x^(3)+5x^(2)+6x^(1)+7x^(0)。我用一个向量来表示数字,我遇到的问题是向量没有正确填充 例如,如果向量称为vec1,则上述输入将给出: `vec1[0]==4 vec1[1]==5 vec1[2]==6 vec1[3]==4 vec1[4]==4` 但我希望它能输出: `vec1[0]==3 vec1

我曾经有过一段我无法理解的代码。前提是输入一组数字:3 4 5 6 7,然后使用istream和ostream输出:4x^(3)+5x^(2)+6x^(1)+7x^(0)。我用一个向量来表示数字,我遇到的问题是向量没有正确填充

例如,如果向量称为vec1,则上述输入将给出:

    `vec1[0]==4
    vec1[1]==5
    vec1[2]==6
    vec1[3]==4
    vec1[4]==4`
但我希望它能输出:

    `vec1[0]==3
    vec1[1]==4
    vec1[2]==5
    vec1[3]==6
    vec1[4]==7`
我找不到任何将istream与向量一起使用的示例教程,所以我希望有人能帮助我了解将istream与向量一起使用的基础知识?只要一个普通的例子就绝对好了

PS:我是C++新手,所以我很抱歉我的术语使用错误。 编辑:(这是我当前的istream代码):

istream&operator>>(istream&left,多项式&right)//输入
{
int tsize,tmp;
而(!(左>>tsize))
{
左。清除();
左。忽略();
}
如果(tsize<0)
{
tsize*=-1;
}
向量MP1;
对于(int i=0;i>tmp))
{
左。清除();
左。忽略();
} 
右[i]=tmp;
}
//返回一个值
左转;
}
`

void多项式::集合多项式(vectorvec1)
{
对于(int i=0;i
啊,我明白了。像这样的怎么样:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

// A polynomial is represented as a single non-negative integer N representing 
// the degree, followed by N+1 floating-point values for the coefficients in
// standard left to right order. For example:
//   3 4 5 6 7
// represents the polynomial
//   4x**3 + 5x**2 + 6x + 7

std::istream& operator >> ( std::istream& ins, Polynomial& p )
{
  // You could set p to something invalid/empty here
  // ...

  // Get the degree of the polynomial
  int degree;
  ins >> degree;
  if (degree < 0) ins.setstate( std::ios::failbit );
  if (!ins) return ins;

  // Get the polynomial's coefficients
  std::vector <double> coefficients( degree + 1 );
  std::copy_n( 
    std::istream_iterator <double> ( ins ), 
    degree + 1, 
    coefficients.begin()
  );
  if (!ins) return ins;

  // Update p
  p.setPolynomial( coefficients );
  return ins;
}
#包括
#包括
#包括
#包括
//多项式表示为单个非负整数N,表示
//度,后面是中系数的N+1浮点值
//标准的从左到右顺序。例如:
//   3 4 5 6 7
//表示多项式
//4x**3+5x**2+6x+7
std::istream&operator>>(std::istream&ins、多项式和p)
{
//您可以在此处将p设置为无效/空
// ...
//得到多项式的阶数
智力度;
ins>>学位;
if(度<0)ins.setstate(标准::ios::故障位);
如果(!ins)返回ins;
//得到多项式的系数
std::向量系数(度+1);
标准::复印件(
std::istream_迭代器(ins),
学位+1,
begin()的系数
);
如果(!ins)返回ins;
//更新p
p、 集合多项式(系数);
返回ins;
}
正确命名事物会有所帮助,并确保正确循环事物。如果出现错误,输入流将正确地记录错误,除非度为负,我们需要一个特例

我使用了一些标准对象,而不是循环;您可以使用任何您觉得更方便的方法:请记住,在第一个整数值之后有N+1个双精度

最后,记住正确地使用多项式函数:如果可以使用一个向量在一次传递中设置所有系数,那么就这样做

(顺便说一句,这段代码是在我脑海中输入的,可能是打字错误和愚蠢的错误。)


编辑根据Caleth的评论进行修改。

显示代码。我怀疑您有一些简单而常见的错误;对于(inti=0;i
——无需执行此操作。这就是所需的全部--
向量tmp2(tsize)
您可以使用
向量(size\u t)
构造函数和
系数。begin()
而不是
back\u inserter
,以避免在
副本中重新分配
    void Polynomial::setPolynomial(vector<double>vec1)
    {
        for (int i = 0; i < vec1.size(); i++)
            polynomial.push_back(vec1[i]);

    }
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

// A polynomial is represented as a single non-negative integer N representing 
// the degree, followed by N+1 floating-point values for the coefficients in
// standard left to right order. For example:
//   3 4 5 6 7
// represents the polynomial
//   4x**3 + 5x**2 + 6x + 7

std::istream& operator >> ( std::istream& ins, Polynomial& p )
{
  // You could set p to something invalid/empty here
  // ...

  // Get the degree of the polynomial
  int degree;
  ins >> degree;
  if (degree < 0) ins.setstate( std::ios::failbit );
  if (!ins) return ins;

  // Get the polynomial's coefficients
  std::vector <double> coefficients( degree + 1 );
  std::copy_n( 
    std::istream_iterator <double> ( ins ), 
    degree + 1, 
    coefficients.begin()
  );
  if (!ins) return ins;

  // Update p
  p.setPolynomial( coefficients );
  return ins;
}