异构查找比较器

Tom*_*mas 6 c++ c++14

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

T.C*_*.C. 9

考虑:

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

std::set<Foo> s;
Bar b;
s.find(b);
Run Code Online (Sandbox Code Playgroud)

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

相反,如果s改为透明比较仿函数std::less<>,那么结合异构查找,每个比较find()都将在a Foo和a 之间进行Bar,因此每次比较都会构造一个临时的Foo.这是一种无声的性能下降.