使用c++标准库,复制算法
Using standard library in C++, copy algorithm
我想学习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之前的代码)。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 错误:在"模板"之前预期主表达式,具有算法的复制功能
- 使用 while 循环和搜索算法进行复制
- STL算法函数,如累加,如果传递给它们的函数接受引用,请避免复制
- 是否有标准算法要复制直到
- 具有四个迭代器的类似复制的算法
- 是否允许标准库算法复制谓词参数
- 使用复制算法在 C++ 中打印矢量的格式问题
- 使用ifstream复制算法
- 生成和复制矢量的STL算法
- 为什么序列运算算法谓词是通过复制传递的
- 使用back_inserter复制算法
- 使用c++标准库,复制算法
- 另一个复制算法
- c++复制直到算法
- 我可以使用复制算法复制'set'中的'vector'元素吗?
- 作用于可移动但不可复制对象序列的变化STL算法的行为