是否可以在STL映射中使用自定义类代替std :: pair?

时间:2009-05-20 15:24:39

标签: c++ map std-pair

这可能吗?

#include <map>

class Example {

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

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

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

对此的理性是,带有自定义比较器的std::binary_search排序向量几乎与地图查找一样快,有时甚至更快,迭代速度更快。插入操作虽然更昂贵(你必须在每次插入后调用sort)。很多地图用例虽然很少插入。

矢量比集合更灵活。

我用这种方法替换了2000个复杂对象的地图(用int索引),迭代和处理地图中的每个对象在服务器类系统上从50秒变为小于5。地图查找次数没有明显差异。

答案 3 :(得分:-2)

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