如何在C++中重新实现包含指针的 STL 容器的类的迭代器

How to reimplement iterator of a class that contains STL container of pointers in C++

本文关键字:指针 包含 STL 迭代器 实现 C++ 新实现      更新时间:2023-10-16

我有一个类,其中包含指向另一个类的指针向量:

class B {};
class A {
std::vector<B*> data_;
};

我想为用户提供一个迭代器。我想过在类中使用typedef std::vector<B*>::iterator iterator,但这带来了一个问题,即iterator::operator*()返回一个B*,我希望它完全隐藏用户的内部表示。

我没有找到重新实现operator*的方法,我突然想到,也许唯一的解决方案是嵌套一个带有对 STL 迭代器的迭代引用的类:

class B {};
class A {
std::vector<B*> data_;
class iterator {
std::vector<B*>::iterator it;
B& operator*();
...
};
};

但我想知道,有没有其他更优雅的方式来完成这一点?我的方法意味着重新实现所有成员函数,只是为了在std::vector<>::iterator中调用等效的函数,除了已经提到的运算符。

谢谢!

对于 C++20 个范围,您可以执行以下操作:

auto bView() /*const*/ {
return data_
| std::views::filter([](auto* p){ return p != nullptr; })
| std::views::transform([](auto* p) -> decltype(auto) { return *p; });
}