【问题标题】:Using standard library in C++, copy algorithm在 C++ 中使用标准库,复制算法
【发布时间】:2013-05-25 10:58:11
【问题描述】:

我正在尝试学习 C++ 中的标准库,并且正在尝试运行我的代码,但我无法成功。我忘记了什么,我需要在我的类“Class”中添加什么以使程序按应有的方式运行?

    #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;
    }

【问题讨论】:

  • @codesinchaos 也许你能帮我解决这个问题? :)

标签: c++ algorithm tree copy


【解决方案1】:

std::ostream_iterator 使用插入运算符&lt;&lt; 将对象插入到输出流中。您必须提供这样的运算符。使用成员函数的示例实现:

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

【讨论】:

  • 非常感谢你们的帮助! @Angew
【解决方案2】:

您的代码有几个问题。第一个应该导致编译错误的是,您的类没有为流输出声明&lt;&lt; 运算符,这意味着它不能使用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 中,两个对象将包含相同的指针,由于在销毁第二个对象时双重释放而导致运行时错误。修复该问题您要么需要自己声明这些操作,要么(甚至更好)不自己进行资源管理,而是使用智能指针(c++11 std::unique_ptr 或 std::shared_ptrstd::tr1::shared_ptr 或来自 boost for pree 的指针C++11 代码)。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2022-01-22
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多