c++ - 为什么异构查找比较器不是默认的?

标签 c++ c++14

我们在 C++14 中进行了异构查找。我想知道为什么 map、set 等的默认比较器没有更改为 less<>。如果没有此更改,普通 C++ 用户将完全错过此功能,并且在 set 中查找 const char* 时的性能损失仍然存在。我在我公司的代码库中已经多次看到这种模式。甚至 MS 在其 GoingNative 视频中也表明这是一个真正的性能瓶颈。我怀疑代码被破坏是问题所在,但我看不出对于已经在 c++98/11 中运行的代码怎么会发生这种情况

最佳答案

考虑:

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() 中的每个比较将介于 Foo 之间和一个 Bar , 所以每次比较都会构造一个临时的 Foo .这是无声的性能下降。

关于c++ - 为什么异构查找比较器不是默认的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26434414/

相关文章:

C++ vector 在 Release模式下未初始化为空

.net - 用于音频演示的GUI控件

c++ - 链接时如何删除拷贝?

c++ - 对 int[2] 数组进行排序无法编译

c++ - 我可以使用加密哈希作为文件名还是必须先转换它?

c++ - 如何将模板类型(std::array 或 std::vector)传递给模板参数

c++ - 在 C++ 中重复跟踪计时器

c++ - 打印 unicode 字符

c++ - 从 lambda 继承是什么意思?

c++ - 我可以在不创建语法怪物的情况下转发(类型)通用重载函数吗?