【发布时间】:2010-11-12 14:10:42
【问题描述】:
我有一个 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; }
// ...
};
现在我想在内部将其从 std::map<int, double> 更改为 std::set<int>,但我不想破坏任何客户端代码。
所以insert 函数中的double d 现在将被忽略。以下代码应该仍然有效,其中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;
}
如何在Foo 类中进行这些更改?
换句话说,我怎样才能提供一个Foo::const_iterator 来适应新的内部std::set<int>::const_iterator 以使其表现得像旧的std::map<int,double>::const_iterator?
更新:我想摆脱map 的原因是内存效率。我有数百万个 Foo 实例,无法在其中存储 double 值。
【问题讨论】:
-
老实说,这听起来是个非常糟糕的主意。当语义完全改变时保持合约兼容是没有意义的。
-
@KonradRudolph C++ 从第一天就开始这样做了。
-
@wilhelm:确实如此。但不是这样做的理由。
-
@Konrad 是的。我在开玩笑:在 C++ 中,它是(现在有问题的?)设计的一部分。这是一个明显的后果,我们可能可以避免。向后兼容性是个难题,只有在绝对必须要做的时候才要做。
标签: c++ stl iterator encapsulation