C平衡二叉树与C++;映射性能 与一些经验丰富的开发人员讨论了C++中的容器,他们告诉我,为了更好的性能,而不是使用STD::MAP,他们只使用一个经典的C二叉树。 既然std::map是作为二叉树实现的,那么用户实现的C风格二叉树比std::map快有什么原因吗?

C平衡二叉树与C++;映射性能 与一些经验丰富的开发人员讨论了C++中的容器,他们告诉我,为了更好的性能,而不是使用STD::MAP,他们只使用一个经典的C二叉树。 既然std::map是作为二叉树实现的,那么用户实现的C风格二叉树比std::map快有什么原因吗?,c++,c,tree,binary,stdmap,C++,C,Tree,Binary,Stdmap,std::map的效率比C中的一些树实现低的一个原因是它不是“侵入性的” 侵入式容器是将簿记信息直接存储在值中的容器。例如,C中的二叉树可能基于以下类型: struct node { node *left, *right; int key; int value; }; 在C++中,它将是: std::map<int, int> std::map 区别在于,当你将一个键值对插入到C++映射中时,映射分配内存来保存节点,然后复制密钥/值对。在C语言中,节点可

std::map的效率比C中的一些树实现低的一个原因是它不是“侵入性的”

侵入式容器是将簿记信息直接存储在值中的容器。例如,C中的二叉树可能基于以下类型:

struct node {
    node *left, *right;
    int key;
    int value;
};
在C++中,它将是:

std::map<int, int>
std::map

区别在于,当你将一个键值对插入到C++映射中时,映射分配内存来保存节点,然后复制密钥/值对。在C语言中,节点可以分配一次,然后插入到树中,而无需进一步分配或复制

在C++中实现了多个入侵容器,主要目标是与C风格的数据结构进行性能平价。没有

map
,但是有
boost::intrusive::set
,可以使用它(通过使
value\u type
同时保留键和map中的值)


添加了C++17,允许插入节点而无需复制键和值。但是获得
节点类型
值的唯一方法是使用
std::map::extract(key)
。您不能在容器外分配节点(可以使用C或Boost Intrusive)。

他们是否通过实际的性能度量来支持他们的声明?因为std::map是以二叉树的形式实现的,它通常是以相关视频的形式实现的:。此外,“过早优化是万恶之源”。在没有进行密集的性能测量的情况下,我永远不会对C库进行C++类(特别是STD类)的交易。答案“使用这个,因为它更快。”是一个相当危险的说法。您希望使用最适合您的用例的内容。如果你的“map”使用在运行时占用了CPU周期的0.5%,那么为什么要用其他的东西来代替它呢,尤其是如果你把C++和STD库中的所有好处都丢掉了。(我也不认为经典的C二叉树真的更快)。@Hajo Kirchhoff。他们的团队正在编写一个完全专业的代码,在测试之后,他们最终使用C树来代替std::map,因为代码的一部分实际上关系到整个过程的速度。