2

这可能吗?

#include <map>

class Example {

  private:
  std::map<std::string, std::string, less<std::string>,
    std::allocator< CustomPair<std::string, std::string> > > myMap;
};

在上面的示例中,CustomPair 将是一个包含键和值的模板类。如果这是可能的,那么简单还是我应该注意什么?

4

4 回答 4

7

只能推测你的真正意图是什么,所以我假设你已经有一个包含键和值的类。在这种情况下,带有自定义比较的 std::set 可能是比 std::map 更好的选择。

然后,您需要提供一个仅比较类的关键部分的比较,并且只要对象在集合中,关键部分就必须是 const (不随时间变化)。正如评论中提到的,集合的元素只能作为 const 访问,因此如果要更改此类元素的值,则需要 const_cast 写入访问权限或声明成员可变。

在另一个答案中,iain提出了另一个非常好的建议。如果您很少插入容器并且主要访问容器以搜索元素,那么排序的 std::vector 和 std::binary_search 是该集合的非常有效的替代方案。

于 2009-05-20T15:30:08.227 回答
3

我更有可能使用 std::set。

于 2009-05-20T15:30:51.093 回答
3

我会使用 lothar 描述的集合,或者使用std::vector“有效 STL”第 23 章中描述的排序:“考虑用排序向量替换关联容器”。

这样做的原因是std::binary_search带有自定义比较器的排序向量的速度几乎与地图查找一样快,有时甚至更快,并且迭代速度要快得多。虽然插入操作更昂贵(您必须在每次插入后调用排序)。但是,许多地图用例很少插入。

向量将比集合更灵活。

我用这种方法替换了包含 2000 个复杂对象(由 int 索引)的映射,在服务器类系统上,迭代和处理映射中的每个对象从 50 秒缩短到不到 5 秒。地图查找时间没有明显差异。

于 2009-05-20T16:27:28.733 回答
-2

我认为你可以做到但不会得到预期的效果,因为使用std::allocator将通过 完成rebind<std::pair>,从而覆盖你对CustomPair. 事实上,你放什么类型可能并不重要,STL 函数会忽略它。至少他们中的一些人肯定会这样做,但我不确定所有人都会这样做。严格来说,这几乎可以肯定是依赖于实现的。我不知道标准是怎么说的。

于 2009-05-20T16:00:30.957 回答