这可能吗?
#include <map>
class Example {
private:
std::map<std::string, std::string, less<std::string>,
std::allocator< CustomPair<std::string, std::string> > > myMap;
};
在上面的示例中,CustomPair将是一个包含键和值的模板类。如果这是可能的,那么这么简单还是有什么我应该注意的?
答案 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函数会忽略它。至少其中一些肯定会这样做,但我不确定是否会这样做。严格来说,这几乎肯定是依赖于实现的。我不知道标准说的是什么。