C++98 v. C++11 std::set::insert Specifications
C++98 v. C++11 std::set::insert Specifications
作为位置提示传递给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的原始实现是根据当前规范工作的,据我所知,大多数(所有?)实现都做了同样的事情(尽管有一个在之前和之后,如果指定任何一个,您将获得最佳行为)。
这也可以暗示插入将在集合的开头,这在以前的规范中是不可能的。
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- C++98 v. C++11 std::set::insert Specifications