C++中封装std::map的模板类如何实现自定义迭代器
实现方案
最稳妥、代码量最小的实现方式是直接复用内部std::map自带的迭代器,不需要从零自定义迭代器类,所有迭代器逻辑直接复用标准库实现,自动适配任意合法的K、V模板参数。
具体实现步骤
- 在类的
public访问域下,通过using定义迭代器类型别名,覆盖非const、const、正向、反向的常用迭代器类型,注意依赖模板参数的嵌套类型前必须加typename关键字,否则会触发编译错误。 - 实现标准迭代器接口要求的
begin()/end()、cbegin()/cend()以及反向迭代器对应的方法,方法内部直接返回内部mmap成员对应方法返回的迭代器即可。
完整的类补充示例代码如下:
#include <map> template<typename K, typename V> class my_map { private: std::map<K, V> mmap; public: // 迭代器相关类型定义 using iterator = typename std::map<K, V>::iterator; using const_iterator = typename std::map<K, V>::const_iterator; using reverse_iterator = typename std::map<K, V>::reverse_iterator; using const_reverse_iterator = typename std::map<K, V>::const_reverse_iterator; using value_type = typename std::map<K, V>::value_type; using size_type = typename std::map<K, V>::size_type; // 正向迭代器接口 iterator begin() noexcept { return mmap.begin(); } iterator end() noexcept { return mmap.end(); } const_iterator begin() const noexcept { return mmap.begin(); } const_iterator end() const noexcept { return mmap.end(); } const_iterator cbegin() const noexcept { return mmap.cbegin(); } const_iterator cend() const noexcept { return mmap.cend(); } // 反向迭代器接口 reverse_iterator rbegin() noexcept { return mmap.rbegin(); } reverse_iterator rend() noexcept { return mmap.rend(); } const_reverse_iterator rbegin() const noexcept { return mmap.rbegin(); } const_reverse_iterator rend() const noexcept { return mmap.rend(); } const_reverse_iterator crbegin() const noexcept { return mmap.crbegin(); } const_reverse_iterator crend() const noexcept { return mmap.crend(); } // 其余自定义业务方法,比如insert、find、operator[]等,按需包装mmap的对应方法即可 };
注意事项
- 该方案实现的迭代器行为和原生
std::map迭代器完全一致,支持解引用、自增自减、成员访问、迭代器比较等所有标准操作,同时自动支持C++11及以上版本的范围for循环。 - 如果后续需要自定义迭代器逻辑(比如遍历过程中过滤特定键值对、增加访问日志/统计逻辑),再考虑手写自定义迭代器类即可,常规场景下直接复用标准库迭代器是最优选择,没有重复造轮子的必要。
使用示例:
int main() { my_map<std::string, int> score_map; // 按需实现insert等业务方法后即可正常使用迭代器 // score_map.insert({"Alice", 90}); // score_map.insert({"Bob", 85}); // 非const遍历修改值 for (auto& [name, score] : score_map) { score += 5; } // const遍历只读访问 const auto& const_map = score_map; for (const auto& [name, score] : const_map) { std::cout << name << ": " << score << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者SPlatten
相关产品推荐
相关产品推荐

