复制和交换习语和迭代器
Copy and Swap Idiom and Iterators
我一直在用嵌套迭代器编写一个双向链表。当我在处理复制构造函数和运算符=重载时,我遇到了复制交换习语。但据我所知,它使用了三法则(如果你愿意,也可以用一个半法则(。但是迭代器没有析构函数,因为它们指向的"节点"不是它们的"属性",而是它的双重列表。
这是一个大学作业,无论情况如何,我都被要求编写一个复制构造函数和运算符,无论它是否与隐式定义相同。
我的问题是复制交换成语总是需要有一个设计者吗?如果是这样,在迭代器的情况下,这会起作用还是我应该使用正常的"脏"赋值?以下是我的迭代器类的相关部分:
template<class T>
class List<T>::ForwardIterator {
private:
Node<T> *current;
public:
ForwardIterator(Node<T> *curr = nullptr) : current(curr) {}
ForwardIterator(const ForwardIterator& right) : current(right.current) {}
...
...
上面的部分显示了迭代器的构造函数和私有数据。下面的部分显示了它的分配和交换功能。
friend void swap(ForwardIterator& first, ForwardIterator& second) {
using std::swap;
swap(first.current, second.current);
}
ForwardIterator& operator=(ForwardIterator right) {
swap(*this, right);
return *this;
}
这是我的实现,我想知道在这里使用是否明智?(我的迭代器没有析构函数,因此我的问题(。
你所拥有的是正确的,可以工作,但不是必需的。
由于您的迭代器不负责节点,因此它持有指向它的指针,因此可以不执行任何操作的节点。 因为您有一个不执行任何操作的析构函数,所以不需要对任何复制/移动构造函数或复制/移动赋值运算符执行任何特殊操作。 这意味着您不需要定义它们中的任何一个,您可以遵循零规则。
请记住,只有当您的类实际负责获取和释放资源时,您才需要实现 3 规则/5 规则。 如果你所做的只是处理 POD/RAII 类型,那么编译器默认值将"做正确的事情"。
相关文章:
- 使用std::multimap迭代器创建std::list
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++中带有List类的迭代器Segfault
- 如何在c++迭代器类型中包装std::chrono
- 集合上的输出迭代器:assign和increment迭代器
- Boost Spirit,获取迭代器内部语义动作
- 对于set上的循环-获取next元素迭代器
- 为什么output_editor Concept不需要output_e迭代器标记
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 使用迭代器时如何访问对象在向量中的位置?
- std::vector::迭代器是否可以合法地作为指针
- 跟随整数索引列表的自定义类迭代器
- 不明白迭代器,引用和指针失效,一个例子
- 我可以使用反向迭代器作为ForwardIt吗
- ESP8266单片机矢量迭代器的C++问题
- 如何在C++中将迭代器作为函数参数传递
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何在 c++ 中将字符串迭代器变量传递给函数?
- 复制和交换习语和迭代器
- C++17 pimpl 习语上下文中的自定义迭代器