c++ - C++:迭代器的复制构造函数
问题描述
我目前正在更新我的语言知识,并在此处找到以下示例定义迭代器类。我说这个迭代器中的复制构造函数的方式是这样定义的,它只会创建一个浅拷贝,或者我错过了什么?
考虑到类属性是一个 int 指针,这不会在使用时产生问题吗?
谢谢。
// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) const {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) const {return p!=rhs.p;}
int& operator*() {return *p;}
};
解决方案
“深度”复制的概念仅适用于通过某种引用(例如指针)拥有另一个对象的对象。迭代器以非拥有方式使用其值(指针),因此复制该指针的值足以维护类的语义。
事实上(正如 Caleth 在评论中指出的那样),在这种情况下,默认情况下编译器会精确地生成这个 copy-ctor,所以你甚至不必编写它。
如果您的 copy-ctor 实际上复制了指向的数据,那么它就不是一个很好的迭代器,因为您将失去对要迭代的对象的访问权限。
推荐阅读
- c# - C# 微软身份认证
- r - 执行停止 - R 命令行参数
- sql - 如何在 ACCESS 中使用不同的 WHERE 条件更新表的一个字段(在单个查询中)
- javascript - 类组件 React 中的删除函数
- java - 读取不带引号的csv元素时数据的类型是什么?
- primefaces - Primefaces validateContentType 不起作用
- embed - 如何通过单击 Google 协作平台中的按钮下载 PDF 文件?
- flutter - 如何设置蓝牙设备在flutter中自动连接和断开?
- yolov4 - 如何在 cvat 中使用 Yolo_v4-tiny 训练模型进行自动注释
- typescript - 奇怪的对象可能是 TypeScript 中的“空”错误