异构查找比较器

时间:2014-10-17 22:44:27

标签: c++ c++14

我们在C ++ 14中进行了异构查找。我想知道为什么map,set等的默认比较器没有改为less<>。如果没有这种改变,平均C ++用户完全错过了这个功能,并且在set< string>中查找const char *时会降低性能。还在那里。我在公司的代码库中看到过这种模式的次数太多了。甚至MS表明这是其GoingNative视频中的一个真正的性能瓶颈。我可以怀疑代码的破坏是问题,但我不知道它是如何发生在已经在c ++ 98/11中工作的代码

1 个答案:

答案 0 :(得分:9)

考虑:

struct Foo { bool operator<(const Foo&) const;};
struct Bar { operator Foo() const; };

std::set<Foo> s;
Bar b;
s.find(b);

默认情况下,s使用std::less<Foo>s.find()使用const Foo &,因此查找会从Foo构建一个临时Bar并将其用于所有比较。

相反,如果将s更改为透明比较仿函数std::less<>,则结合异构查找find()中的每个比较将介于FooBar,因此每次比较都会构建一个临时的Foo。这是一种无声的性能下降。