【发布时间】:2014-06-26 00:22:59
【问题描述】:
给定一个模板类,例如
template <class Key, class Value>
class CustomMap {
// standard map implementation here, with (say) 'put', 'contains' and 'get'
};
假设我不关心 Value 参数(因为我希望将地图作为一个集合使用),并且我不能使用标准 C++ 容器,那么推荐的方式是什么?
一种选择是使用 typedef:
typedef UNUSED int;
const UNUSED UNUSED_VALUE = 0;
CustomMap<std::string, UNUSED> map;
map.put("test", UNUSED_VALUE);
cout << map.contains("test");
在这种情况下你会推荐什么?显然,CustomMap<std::string, void> 无法编译,因为对 void 的引用无效。我无法更改CustomMap 的实现,也无法添加CustomSet 来补充它。
注意:这些要求来自教育环境;因此,正在寻求最具可读性和可理解性的答案。这个答案很可能是“添加评论解释你为什么使用 int”......
【问题讨论】:
-
您可能希望使用
char而不是int,因为它占用的内存更少,但我不确定这是否最终会影响您的自定义集/映射...为什么不使用 std ::设置?。 -
我的建议是“不要这样做”。集合不是地图。
-
您应该使用
struct dummy_struct{};(不是int)。而且您应该将整个内容包装在您自己的类中,以便将map适应set的麻烦只在一个地方。 -
基于比较器构建数据结构,然后使用该数据结构提供两个接口:set 和 map 有什么问题,就像大多数 STL 实现都有底层平衡树一样结构和不同的接口?当前的方法将要求您在仅将其用作一个集合时浪费一些空间(您仍然需要将值,至少 1 个字节,加上填充)添加到每个节点......现在我想到了,它对你的期望可能有点过分,但你会真正从经验中学习。
-
我不确定是否需要花费大量时间来完成重构,您可能可以将现有的
CustomMap重写为SortedTree,然后构建Map和Set在一两个小时内达到顶峰。学生可能会有些困惑,但可能会酷将现有解决方案推广到更强大的东西。