MST

星途 面试题库

面试题:C++ STL 迭代器与自定义类型

假设有一个自定义类 MyClass,创建一个包含 MyClass 对象的 std::list 容器。请实现一个函数,使用迭代器遍历该列表,并对每个 MyClass 对象调用特定成员函数。同时,说明迭代器失效的场景以及如何避免,尤其是在对 std::list 进行插入和删除操作时。
21.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <list>

class MyClass {
public:
    void specificMemberFunction() {
        std::cout << "MyClass specific member function called." << std::endl;
    }
};

void traverseAndCall(std::list<MyClass>& myList) {
    for (auto it = myList.begin(); it != myList.end(); ++it) {
        it->specificMemberFunction();
    }
}

迭代器失效场景及避免方法

  1. 插入操作

    • 场景:当在 std::list 中插入元素时,除了指向插入位置的迭代器不会失效外,其他迭代器都不会失效。例如在 std::list<int> myList; auto it = myList.begin(); myList.insert(it, 10); 中,it 不会失效,其他迭代器也不会失效。
    • 避免方法:在插入元素后,如果需要继续使用迭代器,只需保存插入操作返回的迭代器(insert 操作返回指向新插入元素的迭代器)。例如 auto newIt = myList.insert(it, 10);,之后可以使用 newIt 继续操作。
  2. 删除操作

    • 场景:当在 std::list 中删除元素时,指向被删除元素的迭代器会失效,而其他迭代器不会失效。例如 std::list<int> myList = {1, 2, 3}; auto it = myList.begin(); ++it; myList.erase(it);,这里 it 失效。
    • 避免方法:使用 erase 成员函数的返回值,erase 函数返回指向被删除元素之后元素的迭代器。例如 it = myList.erase(it);,这样可以在删除元素后继续使用 it 进行遍历等操作。