C++98 v. C++11 std::set::insert Specifications

C++98 v. C++11 std::set::insert Specifications

本文关键字:set Specifications insert std C++11 C++98      更新时间:2023-10-16

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

对c++ 11进行一般检查似乎不是一个好主意(1,2),而且我没有看到合适的Boost。配置宏。

特别地,c++ 98的文档说:

如果位置指向位于插入元素之前的元素。

而对于c++ 11,它说:

如果位置指向元素插入的元素之后(如果是,则到末尾)会是最后一次)。

这很重要,因为提示会影响插入调用的复杂性。如果提示是正确的,那么复杂度只是一个平摊常数。但如果不是,它的大小是对数的。

更新

这是一个缺陷报告的主题,LWG问题#233,和n1780。

如前所述,这显然是编辑c++ 98标准时的一个简单错误。

Stepanov的原始实现是根据当前规范工作的,据我所知,大多数(所有?)实现都做了同样的事情(尽管有一个在之前和之后,如果指定任何一个,您将获得最佳行为)。

这也可以暗示插入将在集合的开头,这在以前的规范中是不可能的。