insert
,以保留等效元素的插入顺序 (issue #68)。std::size_t
而不是 unsigned long
来保存和加载 multi_index_container
的大小(在 LLP64 数据模型中,unsigned long
小于 std::size_t
)。multi_index_container
序列化类版本已从 3 提升到 4 以反映此更改。
unsigned long
而不是 collection_size_type
,并且 multi_index_container
序列化类版本已从 2 提升到 3 以反映此更改。对于为 collection_size_type
值提供特殊处理的自定义存档类型,读取旧存档可能会失败:如果出现这种情况,请全局定义宏 BOOST_MULTI_INDEX_ENABLE_SERIALIZATION_COMPATIBILITY_V2
以确保读取操作的向后兼容性。
count
操作的效率从 O(log(n) + count)
提高到 O(log(n))
。由 Damian Sawicki 贡献。
contains
(issue #35)。merge
操作。该功能在许多方面超越了(无序)关联容器的标准规范,最值得注意的是x.merge(y,first,last)
仅合并 y
中 [first
,last
) 范围内的元素。splice
是破坏性的,即元素被复制插入到目标中,然后从源中删除。现在,splice
基于节点传输,非常像基于键的索引中的 merge
,并且同样被扩展为接受任何类型的源索引:事实上,splice
可以被视为基于键的索引中 merge
提供的相同功能的前端。出于向后兼容性的原因,如果源容器和目标容器具有不相等的分配器,则保留 splice
的破坏性行为。node_type
和索引在其 multi_index_container
中的位置(散列索引除外,其中唯一性/非唯一性也是依赖项)。这对于通过 merge
或 splice
传输的元素的迭代器的有效性具有影响。此属性是 C++ 标准邮件列表中所谓的 SCARY 迭代器 的变体。SCARY 性目前(2021 年 8 月)未强制用于标准容器。
multi_index_container
现在是 AllocatorAware
。KeyFromValue
、Compare
、Hash
和 Pred
对象的交换现在根据 [swappable.requirements] 中的标准规范,在 std::swap
和 ADL 候选项之间选择适当的 swap
函数 (issue #29)。
const_mem_fun
和 mem_fun
的变体 (issue #24)。noexcept
指定的成员函数 (issue #24)。
size_type
和 difference_type
现在定义为分配器同名的类型。这在绝大多数情况下不会有任何区别,但允许通过用户定义的分配器类型对生成的内部结构进行一定程度的控制(有关动机,请参见 issue #17)。目前,此更改未在参考部分中记录(即,它具有半官方地位)。
multi_index_container
的默认构造函数不再是 explicit
(ticket #13518)。
operator&
的元素 (ticket #13307)。感谢 Daniel Frey 更新 Boost.Operators 以帮助解决此问题。std::allocator
成员。由 Daniela Engert 贡献。
modify
和 modify_key
更加健壮,以便在修饰符抛出异常或回滚仿函数未正确恢复元素时擦除修改后的元素(完整讨论请参见 ticket #12542)。这在技术上是向后不兼容的;例如,以下代码在以前的 Boost 版本中,容器c.modify(c.begin(),[](auto&){throw 0;});
c
保持不变,而现在 c.begin()
被擦除。感谢 Jon Kalb 提出问题。
foreach
而导致的与 Qt 的互操作性问题。
key_type
的临时值的情况下,查找操作的效率得到了提高。例如,考虑以下代码在库的先前版本中,typedef multi_index_container< std::string, indexed_by< ordered_unique<identity<std::string> > > > multi_t; ... multi_t m=...; m.find("boost"); // passed a const char*, not a std::string
find
操作生成了多个临时 std::string
(每次进行内部比较时都会生成一个)。在足够高级的编译器中,现在避免了这种情况,因此只创建一个临时对象。
std::tuple
可用时,这些可以用于配备复合键的索引中的查找操作。boost::tuple
也受支持以实现向后兼容性。
erase(iterator)
成员函数在低负载条件下曾经具有较差的性能(参见 ticket #4264)。根据 LWG issue #579 的决议,此问题已得到修复,同时保持了 erase
的接口,但代价是每个元素多使用一个字内存。事实上,散列索引的 C++ 复杂度要求已得到改进,因此O(n)
而是 O(ndist)
,其中 ndist
是索引中非等效元素的数量。reserve
。noexcept
规范(对于兼容的编译器)。multi_index_container
插入失败的性能。BOOST_BIND_NO_PLACEHOLDERS
兼容 (ticket #9798)。
multi_index_container
现在是高效可移动的。std::unique_ptr<T>
)。这包括插入范围 [first
,last
),其中迭代器指向可转换为元素类型的类型:在此过程中不会发生复制构造。shrink_to_fit()
。
composite_key_compare
中的 ADL 问题。
save_construct_data
和 load_construct_data
正确支持非默认可构造值的序列化。multi_index_container
序列化类版本已从 1 提升到 2。
collection_size_type
类型而不是原始的 std::size_t
(ticket #3365)。multi_index_container
序列化类版本已从 0 提升到 1。
nth_index_iterator<MultiIndexContainer,N>::type
,multi_index_container<...>::nth_index_iterator<N>::type
,nth_index_const_iterator<MultiIndexContainer,N>::type
,multi_index_container<...>::nth_index_const_iterator<N>::type
,index_iterator<MultiIndexContainer,Tag>::type
,multi_index_container<...>::index_iterator<Tag>::type
,index_const_iterator<MultiIndexContainer,Tag>::type
,multi_index_container<...>::index_const_iterator<Tag>::type
.nth_index<MultiIndexContainer,N>::type::iterator
,multi_index_container<...>::nth_index<N>::type::iterator
,nth_index<MultiIndexContainer,N>::type::const_iterator
,multi_index_container<...>::nth_index<N>::type::const_iterator
,index<MultiIndexContainer,Tag>::type::iterator
,multi_index_container<...>::index<Tag>::type::iterator
,index<MultiIndexContainer,Tag>::type::const_iterator
,multi_index_container<...>::index<Tag>::type::const_iterator
.
multi_index_container::multi_index_container(const allocator_type&)
,以模仿 STL 序列容器中的等效接口。
global_fun
预定义键提取器。iterator_to
功能。multi_index_container
可以放置在共享内存中。modify
和 modify_key
的新版本,如教程中所述。cbegin
、cend
以及在适用时提供的 crbegin
和 crend
成员函数,符合 C++ 标准的下一个修订版的最新草案。assign(f,l)
和 insert(p,f,l)
的要求 (23.1.1/9):如果 f
和 l
是相同的整数类型,则避免这些成员函数的基于迭代器的重载typedef multi_index_container< int,indexed_by<sequenced<> > > sequenced_container; std::list<int> l(...); sequenced_container c; // iterator-based overload of assign c.assign(l.begin(),l.end()); // The following is equivalent to // c.assign( // static_cast<sequenced_container::size_type>(10),100); // that is, "10" and "100" are not taken to be iterators as // in the previous expression. c.assign(10,100);
range
和 equal_range
的性能。
T
实例化的所有预定义的 Boost.MultiIndex 键提取器都可以处理从 T
派生或可转换为 T
的类型的对象(以及指向这些对象的链式指针)。以前,仅接受指定的确切类型的对象(以及指向它们的 reference_wrapper
和链式指针)。composite_key_compare
和相关类接受未包含在元组中的操作数,就好像它们在长度为 1 的元组中传递一样;这允许用户在仅提供第一个键时,在涉及复合键的查找操作中省略元组包围。
erase(it)
和 erase(first,last)
现在返回指向被删除元素之后元素的迭代器(以前没有返回任何内容),符合 C++ 标准库 缺陷报告 130 和 TR1 问题列表 的问题 6.19。
multi_index_container
的析构和 clear
成员函数现在执行得更快。2024 年 3 月 15 日修订
© 版权所有 2003-2024 Joaquín M López Muñoz。根据 Boost 软件许可协议 1.0 版分发。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)