在C ++中使用标准库,复制算法

时间:2013-05-25 10:58:11

标签: c++ algorithm tree copy

我正在尝试用C ++学习标准库,我正在尝试运行我的代码,但我无法成功。我忘记了什么,我需要在课程“课程”中添加什么才能使程序按原样运行?

    #include <iostream>
    #include <vector>
    #include <list>
    #include <algorithm>
    #include <iterator>
    using namespace std;

    class Class {
    public:
      Class (int ii, double dd ) : ival(ii)  { dval = new double; *dval = dd; }
      ~Class() { delete dval; }
    private:
      int ival;
      double *dval;
    };

    int main()
    {

      vector<Class> vec;
      list<Class> list;
      vec.push_back( Class(1, 2.2) );
      vec.push_back( Class(2, 4.3) );
      vec.push_back( Class(3, 5.7) );
      ostream_iterator<const Class> classout(cout,"\n");
      copy( vec.begin(), vec.end(), classout );
    }

我基本上是想了解并使用复制算法:

    template
      OutputIterator copy ( InputIterator first, InputIterator last, 
                            OutputIterator result )
    {
      while (first!=last) *result++ = *first++;
      return result;
    }

2 个答案:

答案 0 :(得分:1)

std::ostream_iterator使用插入运算符<<将对象插入到输出流中。您必须提供此类运营商。使用成员函数的示例实现:

class Class {
public:
  Class (int ii, double dd ) : ival(ii)  { dval = new double; *dval = dd; }
  ~Class() { delete dval; }
  void print(std::ostream &stream) const {
    stream << ival << ' ' << *dval;
  }
private:
  int ival;
  double *dval;
};

std::ostream& operator<< (std::ostream &stream, const Class &arg) {
  arg.print(stream);
  return stream;
}

作为替代方案,您也可以通过将其设为friend而不创建成员函数来实现它。

答案 1 :(得分:1)

您的代码有几个问题。第一个应该导致编译错误的是,您的类没有为streamout声明<<运算符,这意味着它不能使用{{1}打印到流中}。要解决这个问题,您需要在类中添加这样的运算符,例如:

ostream_iterator

但是你的代码仍然包含一个严重的问题:违反三条规则(或者如果你使用的是c ++ 11,则为五条/无论如何)。您的类声明了一个自定义析构函数,但既不是自定义复制构造函数也不是自定义赋值运算符。这意味着当您复制类的实例(例如将其放入class Class { public: Class (int ii, double dd ) : ival(ii) { dval = new double; *dval = dd; } ~Class() { delete dval; } friend std::ostream& operator<<(std::ostream& os, const Class& c) { return os<<c.ival<<": "<<*c.dval;//or whatever you want your output to look like } private: int ival; double *dval; }; 时,两个对象将包含相同的指针,由于第二个对象的销毁会导致双重释放,从而导致运行时错误。修复你需要自己声明这些操作,或者(甚至更好)自己不进行资源管理,而是使用智能指针(c ++ 11 std :: unique_ptr或vector,{{1}或者来自boost for C ++ 11代码的指针)。