使用c++标准库,复制算法

Using standard library in C++, copy algorithm

本文关键字:复制 算法 c++ 标准 使用      更新时间:2023-10-16

我想学习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;
    }

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而不创建成员函数来实现它。

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

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)。类声明了自定义析构函数,但既没有自定义复制构造函数,也没有自定义赋值操作符。这意味着,当您复制类的实例时(例如将其放入vector中),两个对象将包含相同的指针,导致由于第二个对象的销毁而导致double free的运行时错误。为了解决这个问题,你要么需要自己声明这些操作,要么(更好的是)不要自己做资源管理,而是使用智能指针代替(c++11 std::unique_ptr或std::shared_ptr, std::tr1::shared_ptr或boost指针,用于c++11之前的代码)。