首页 文章

重载operator->用于STL迭代器

提问于
浏览
1

我正在编写自己的C STL映射容器实现 . 现在我正在尝试实现迭代器 . 它应该允许你做类似iter-> first和iter-> second之类的事情,它们分别返回键/值,而iter是一个对象而不是一个指针 . 我想知道我应该如何重载这个?这有点令人困惑,因为我不确定返回类型应该是什么;我认为它必须是成员第一/第二的对象 . 是否通常返回对包装器/接口对象的引用或类似的东西?

5 回答

  • 3

    标准映射的value_type是 std::pair<const KeyType, MappedType> .

    为了实现正常的指针语义, operator* 返回一个引用,而 operator-> 返回一个指针 .

    //minimal example
    #include <utility>
    #include <cstdio>
    
    struct It
    {
      std::pair<const int, int> pair;
      std::pair<const int, int>* operator->() { return &pair; }
      std::pair<const int, int>& operator*() { return pair; }
    };
    
    int main()
    {
      It it = {std::make_pair(10, 20) };
      (*it).second = 30;
      std::printf("%d %d\n", it->first, it->second);
    }
    
  • 1

    如果你真的是指C标准库,那么 mapvalue_type 就是 pair . 成对的成员有 firstsecond . 在 map 中取消引用迭代器会给你一个 pair .

  • 2

    是的,您需要一个代理来保存相关参考 .

    至于类型:标准库迭代器通常取消引用 value_type 类型的东西 . 对于 map<K,V> ,值类型为 std::pair<K, V> (或者更确切地说, pair<key_type, mapped_type> ),这是从中获取 first / second 接口的位置 .

    (Stephan Lavavej的一个讲座解释了MSVC实现如何为 setmap 使用相同的底层数据结构;唯一的区别是 set::value_type 等于 set::key_type ,而 map::value_typepair<key_type, mapped_type> . 这样你就可以通过简单的特征检查来区分两者 . 但是迭代器接口几乎完全相同 . )

  • 6

    std::map<K,V>::iterator 遍历 std::pair<K,V> 类型的对象 .

  • 6

    你的问题的答案是肯定的 . 您应该返回代理对象或对代理对象的引用以获取该行为 .

相关问题