面试题答案
一键面试#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();
}
}
迭代器失效场景及避免方法
-
插入操作:
- 场景:当在
std::list
中插入元素时,除了指向插入位置的迭代器不会失效外,其他迭代器都不会失效。例如在std::list<int> myList; auto it = myList.begin(); myList.insert(it, 10);
中,it
不会失效,其他迭代器也不会失效。 - 避免方法:在插入元素后,如果需要继续使用迭代器,只需保存插入操作返回的迭代器(
insert
操作返回指向新插入元素的迭代器)。例如auto newIt = myList.insert(it, 10);
,之后可以使用newIt
继续操作。
- 场景:当在
-
删除操作:
- 场景:当在
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
进行遍历等操作。
- 场景:当在