C++ 98 v.C++ 11 std :: set :: insert规范

Jon*_*Jon 13 c++ c++11

迭代器的含义在C++ 98和C++ 11之间作为位置提示std::set::insert(iterator position, const value_type& val)std::multiset::insert(iterator position, const value_type& val)更改传递.在编译时是否有一种简单的方法来检测哪些正在使用并使用不同的代码?

上C++ 11的一般检查并不似乎是一个好主意,(1,2),并且我没有看到合适Boost.Config宏.

具体来说,C++ 98 的文档说:

如果position指向要插入元素之前的元素,则该函数会优化其插入时间.

而对于C++ 11,它说:

如果position指向将跟随插入元素的元素(或者到最后,如果它是最后一个元素),则该函数优化其插入时间.

这很重要,因为提示会影响插入调用的复杂性.如果提示正确,则复杂性仅为摊销常数.但如果不是,它的大小就是对数.

更新

正如下面JerryCoffin所描述的那样,C++ 98规范本质上是一个错字.

Jer*_*fin 15

这是缺陷报告的主题,LWG问题#233n1780.

如前所述,编辑C++ 98标准显然是一个简单的错误.

Stepanov的原始实现根据当前的规范工作,据我所知,大多数(所有?)实现都做了同样的事情(虽然有一个看起来在提示位置之前之后,所以你会得到最佳的行为,如果你指定一个).

这也可以提示插入将位于集合的开头,这在先前的规范下是不可能的.