面试题答案
一键面试#include <iostream>
#include <memory>
// 假设这是容器的数据结构,这里简单用链表节点示意
template <typename T>
struct Node {
T data;
std::unique_ptr<Node<T>> next;
Node(const T& value) : data(value), next(nullptr) {}
};
// MyContainer类
template <typename T>
class MyContainer {
private:
std::unique_ptr<Node<T>> head;
public:
// 内部的常量迭代器类
class const_iterator {
private:
const Node<T>* current;
public:
const_iterator(const Node<T>* node) : current(node) {}
bool operator!=(const const_iterator& other) const {
return current != other.current;
}
const T& operator*() const {
return current->data;
}
const_iterator& operator++() {
current = current->next.get();
return *this;
}
};
// 构造函数
MyContainer() : head(nullptr) {}
// 添加元素到容器,简单示意
void push_back(const T& value) {
if (!head) {
head = std::make_unique<Node<T>>(value);
} else {
Node<T>* temp = head.get();
while (temp->next) {
temp = temp->next.get();
}
temp->next = std::make_unique<Node<T>>(value);
}
}
// 返回常量迭代器的begin函数
const_iterator begin() const {
return const_iterator(head.get());
}
};
实现思路:
- 定义内部常量迭代器类:在
MyContainer
类内部定义一个const_iterator
类,该类应具有与STL常量迭代器相似的接口,如!=
,*
,++
等操作符重载。 - 存储迭代器当前位置:在
const_iterator
类中定义一个成员变量来存储当前迭代的位置,这里用指向链表节点的指针current
。 - 实现操作符重载:
!=
操作符用于比较两个迭代器是否不等。*
操作符用于返回当前迭代器所指向的元素。++
操作符用于将迭代器移动到下一个位置。
- 实现
begin()
函数:在MyContainer
类的begin()
函数中,返回一个指向容器起始位置的const_iterator
对象,这里即链表的头节点。注意begin()
函数本身应声明为const
,以匹配常量迭代器的特性。