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值存储在其中.
也许类似于
operator int()(const std::pair<int, double>& p) const {
return p.first;
}
Run Code Online (Sandbox Code Playgroud)
也许在一些包装内?