c++ - 设计迭代器包装器

标签 c++ stl iterator wrapper

我编写了一个包装迭代器并按需返回转换后值的类:

// iterator-wrapper.h
template<class Iter, class Val, class Fct>
class IteratorWrapper {
  Iter cur_;
  const Iter last_;
  const Fct fct_;
public:
  IteratorWrapper(Iter first, Iter last, const Fct fct)
    : cur_(first), last_(last), fct_(fct) 
  {}
  const Val Value() const {return fct_(*cur_);}
  void Next() {++cur_;}
  bool Done() const {return cur_ == last_;}
};

现在,一个类可以使用它来返回对其数据的某些函数的迭代器:

// mydata.h
#include <map>
#include "iterator-wrapper.h"

class MyData {

  struct GetFirst {
    template<class T1, class T2>
      const T1& operator()(const std::pair<T1,T2>& aPair) const {
      return aPair.first;
    }
  };
  struct GetSecond {
    template<class T1, class T2>
      const T2& operator()(const std::pair<T1,T2>& aPair) const {
      return aPair.second;
    }
  };

  typedef std::string Key;
  typedef int Val;
  typedef std::map<Key, Val> Map;
  typedef Map::const_iterator MapIter;
  Map m_;

public:

  typedef IteratorWrapper<MapIter, Key, GetFirst> KeysIter;
  typedef IteratorWrapper<MapIter, Val, GetSecond> ValuesIter;

  MyData() { // add some data
    m_["foo"] = 1;
    m_["bar"] = 2;
  }

  KeysIter GetKeys() const {
    return KeysIter(m_.begin(), m_.end(), GetFirst());
  }

  ValuesIter GetValues() const {
    return ValuesIter(m_.begin(), m_.end(), GetSecond());
  }
 };

并且,这是一个示例用法:

#include <iostream>
#include "iterator-wrapper-data.h"

 int main() {
   MyData d;

   std::cout << "KEYS:" << std::endl;
   MyData::KeysIter kit = d.GetKeys();
   for(; !kit.Done(); kit.Next()){
     std::cout << kit.Value() << std::endl;
   }

   std::cout << "VALUES:" << std::endl;
   MyData::ValuesIter vit = d.GetValues();
   for(; !vit.Done(); vit.Next()){
     std::cout << vit.Value() << std::endl;
   }
   return 0;
 }

我有几个问题:

  1. 这是一个合理的设计吗,或者可以更简洁地做到这一点,比如使用 STL 或 boost 东西? (我知道有一个 boost::iterator_facade,但我发现该代码比必要的复杂得多,我不确定它是否完全符合我的要求。)

  2. 为什么 std::map 不包含类似开头的东西(我的意思是 keys() 函数返回键的迭代器, ETC。)? (或者是吗?)

  3. 返回引用有什么问题,例如 const Val& Value() const(与上面第一个 list 中的按值返回相反)?

最佳答案

通过查看 boost::iterator_facade,您走在了正确的轨道上,但使用 boost::transform_iterator 会更好。 .

关于c++ - 设计迭代器包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218340/

相关文章:

c++ - ptrdiff_t 太小?

c++ - 如何在 C++ 中对二维数组进行排序

c++ - 原始数组是否比 std::array 有任何优势?

c++ - 我可以使用 std::optional 进行错误处理吗?

c++ - 调用在函数调用期间重新分配的 `std::vector` 元素的函数是否会引起麻烦?

java - 循环迭代器直到它为空

python - 找到回文python空间复杂度?

c++ - 如何从标准输入中检测格式输入错误?

java - 迭代器 - Spring MVC Controller 中的 java.util.NoSuchElementException

c++ - 如何在同一个立体窗口中并排显示 2 个网络摄像头视频?