如何使set迭代器适应地图迭代器的行为?

Fra*_*ank 5 c++ encapsulation iterator stl

我有一个类Foo,它包含一个map提供begin()end()功能遍历它:

class Foo {
  typedef std::map<int, double> Container;
  typedef Container::const_iterator const_iterator;
  Container c_;
 public:
  const_iterator begin() const { return c_.begin(); }
  const_iterator end() const { return c_.end(); }
  void insert(int i, double d) { c_[i] = d; }
  // ...

};
Run Code Online (Sandbox Code Playgroud)

现在我想将其从内部更改std::map<int, double>为只是一个std::set<int>,但我不想破坏任何客户端代码.

所以现在只能忽略函数double d中的insert函数.并且以下代码仍然有效,it->second现在将始终如下0.0:

Foo foo;
for(Foo::const_iterator it = foo.begin(); it != foo.end(); ++it) {
  std::cout << it->first << " " << it->second << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

如何在Foo课堂上进行这些更改?

换句话说,我怎样才能提供Foo::const_iterator适应新内部std::set<int>::const_iterator行为的旧内容std::map<int,double>::const_iterator

更新:我想摆脱的原因map是内存效率.我有数百万个Foo实例,无法负担将double值存储在其中.

wil*_*ell 0

也许类似于

operator int()(const std::pair<int, double>& p) const {
    return p.first;
}
Run Code Online (Sandbox Code Playgroud)

也许在一些包装内?