MST

星途 面试题库

面试题:C++ STL迭代器begin的常量迭代特性与自定义容器

假设你自定义了一个类似容器的类`MyContainer`,其中包含一个成员函数`begin()`。现在要让`begin()`返回一个符合C++ STL常量迭代器特性的迭代器,你需要怎么做?请给出`MyContainer`类的大致框架代码以及`begin()`函数的实现思路。
14.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#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());
    }
};

实现思路:

  1. 定义内部常量迭代器类:在MyContainer类内部定义一个const_iterator类,该类应具有与STL常量迭代器相似的接口,如!=*++等操作符重载。
  2. 存储迭代器当前位置:在const_iterator类中定义一个成员变量来存储当前迭代的位置,这里用指向链表节点的指针current
  3. 实现操作符重载
    • !=操作符用于比较两个迭代器是否不等。
    • *操作符用于返回当前迭代器所指向的元素。
    • ++操作符用于将迭代器移动到下一个位置。
  4. 实现begin()函数:在MyContainer类的begin()函数中,返回一个指向容器起始位置的const_iterator对象,这里即链表的头节点。注意begin()函数本身应声明为const,以匹配常量迭代器的特性。