Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中查找浮动键的优化+;地图_C++_Performance_Map_Double_Stdmap - Fatal编程技术网

C++ 在c+中查找浮动键的优化+;地图

C++ 在c+中查找浮动键的优化+;地图,c++,performance,map,double,stdmap,C++,Performance,Map,Double,Stdmap,我想问一个与此相关的问题: 我制作了一个std::map,其中包含一个双精度作为其他类型MyType的键,即: map<double,MyType> myMap; map-myMap; 我的问题是: 既然myMap.find(…)是std::map查找键的优化方法(请参阅),那么该方法是否明显未被优化?我可以实施更有效的方法吗?它并没有明显的未优化。首先,所有操作的渐近复杂性都是相同的(O(log(n))),只有比较是常数因子。事实上,我不认为你能做得更好,因为你不能以任何更好的

我想问一个与此相关的问题:

我制作了一个std::map,其中包含一个
双精度
作为其他类型
MyType
的键,即:

map<double,MyType> myMap;
map-myMap;
我的问题是:
既然
myMap.find(…)
是std::map查找键的优化方法(请参阅),那么该方法是否明显未被优化?我可以实施更有效的方法吗?

它并没有明显的未优化。首先,所有操作的渐近复杂性都是相同的(
O(log(n))
),只有比较是常数因子。事实上,我不认为你能做得更好,因为你不能以任何更好的方式在安全的同时进行双打比较

STL容器是“优化”的,因为它们满足标准定义的性能要求。虽然不能说它们是完美的,但要求已经非常严格(例如,对于地图中的元素搜索,
O(log(N))
),因此重新实现它们将是一项非常不感激的工作。我想说的是,最好选择最适合你的一个,让它们保持原样。

我一直认为使用
双精度
作为映射键是个坏主意,因为它们不满足严格的弱排序,因为浮点不精确。我错了吗?@Bathsheba链接解决方案建议使用双公差来解决这个问题。映射键必须具有严格的弱顺序,而默认比较器的
double
则不是这种情况。小心。@KerrekSB你能详细说明一下严格的弱项吗?这是因为“特殊”值,如正负零和NaN等,在比较中表现异常吗?还是我错过了什么。“常规”浮点值也是吗?@jalf:只是NaN。NaN破坏了排序。是否可以确认是否将double转换为字符串,而将map定义为
map myMap的效率会高于或低于?我知道字符串转换和字符串比较相对“慢”,但如果使用
map::find()
的功能弥补了这一点,那么它可能更有效?您仍然可以在建议的解决方案中使用map::find。它将简单地使用一个自定义的比较运算符,但其复杂性将与预期的一样。另一方面,使用字符串会使比较速度显著减慢(最多可达双精度字符串表示的长度),并可能使地图的性能更差。建议的解决方案已经很好了,不要试图使用这种“黑客”优化来改进它。