【发布时间】:2015-09-24 10:02:11
【问题描述】:
在cplusplus' entry on map::insert() 上,我读到了一个可以添加作为函数提示的位置,即“如果position 指向将在插入元素之前的元素,则该函数优化其插入时间" 对于 c++98,而对于 c++11,优化发生 "如果 position 指向将 跟随 插入元素的元素(或者到最后,如果它是最后一个)”。
这是否意味着以下形式的代码 sn-ps 的性能(在我正在处理的遗留代码中很丰富,并以 Scott Meyer 的“有效 STL”为模型,第 24 项)在切换到符合 C++11 的编译器?
auto pLoc = someMap.lower_bound(someKey);
if(pLoc != someMap.end() && !(someMap.key_comp()(someKey, pLoc->first)))
return pLoc->second;
else
auto newValue = expensiveCalculation();
someMap.insert(pLoc, make_pair(someKey, newValue)); // using the lower bound as hint
return newValue;
改进此模式以用于 C++11 的最佳方法是什么?
【问题讨论】:
-
这是一个奇妙的不兼容性。干得好,C++。
-
见LWG issue 233 和N1780。我不确定是否存在任何实际实现 C++98 规范的实现。
-
@LightnessRacesinOrbit:那么您是否更喜欢与 C++98 兼容的 bug,就像 Wine 对 Windows API 的承诺一样?有一次,Windows 中存在另一个严重的安全漏洞,Wine 中也发现了同样的漏洞,这当然是相同 API 规范的完全不同的实现。这有点令人印象深刻,但我宁愿 ISO 修复 C++98 中的缺陷,而不是将它们传播到永恒。
-
@ArneVogel:我在一定程度上支持你,但这种特殊变化潜入的方式似乎不可接受。它不仅默默地破坏了早期的程序,而且它也是一个非常微妙的变化,我怀疑很多人甚至会注意到。这似乎与 C++ 项目的既定目标大相径庭,这是一种上升趋势。不过请不要误会:我没有更好的建议。
-
@LightnessRacesinOrbit 是否有针对 C++98 规范编写的实际“早期程序”?因为这需要使用,比如说,
lower_bound,然后递减返回的迭代器——在检查它不是begin()之后,否则它将是UB。
标签: c++ c++11 dictionary insert