在迭代器中实现->
和*
操作符的行为,通常涉及到自定义迭代器类,并重载这两个操作符。下面是一个简单的示例,展示了如何在C++中实现这样的迭代器。
迭代器(Iterator):迭代器是一种设计模式,它提供了一种方法,可以顺序访问聚合对象(如列表或数组)中的各个元素,而无需暴露其底层表示。
操作符重载:在C++中,可以通过重载操作符来改变或扩展内置类型的操作符行为。
以下是一个简单的自定义迭代器示例,用于遍历一个自定义的链表结构:
#include <iostream>
// 定义链表节点
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(nullptr) {}
};
// 自定义迭代器类
class ListIterator {
private:
Node* current;
public:
ListIterator(Node* node) : current(node) {}
// 重载 * 操作符
int& operator*() {
return current->data;
}
// 重载 -> 操作符
Node* operator->() {
return current;
}
// 前缀递增操作符
ListIterator& operator++() {
if (current) current = current->next;
return *this;
}
// 后缀递增操作符
ListIterator operator++(int) {
ListIterator temp = *this;
++(*this);
return temp;
}
// 比较操作符
bool operator!=(const ListIterator& other) const {
return current != other.current;
}
};
// 自定义链表类
class LinkedList {
private:
Node* head;
public:
LinkedList() : head(nullptr) {}
void add(int val) {
Node* newNode = new Node(val);
newNode->next = head;
head = newNode;
}
ListIterator begin() {
return ListIterator(head);
}
ListIterator end() {
return ListIterator(nullptr);
}
};
int main() {
LinkedList list;
list.add(1);
list.add(2);
list.add(3);
for (ListIterator it = list.begin(); it != list.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
问题:迭代器失效,导致未定义行为。
原因:在迭代过程中修改了底层容器,如插入或删除元素。
解决方法:
std::vector::insert
返回的新迭代器。通过上述方法,可以有效地在迭代器中实现->
和*
操作符的行为,并确保其正确性和稳定性。
领取专属 10元无门槛券
手把手带您无忧上云