C/C++编程:STL容器
容器
有三类容器——顺序容器、关联容器和无序关联容器——每种都被设计为支持不同组的操作。
" class="reference-link">
C++标准就“如何在vector、deque、list”中做出选择提供了如下建议
- vector是默认应使用的容器
- 当需要频繁的在序列中间做插入和删除操作时,应该使用list
- 当大多数插入和删除查找在序列的头部或者尾部时,deque是应该考虑的数据结构
可复制构造
- 容器用于容纳数据,但不是所有的数据都能放入容器中。上面各种容器模板对所存数据类型有一个基本要求:可复制构造。
- 将数据放入容器的过程就是通过数据的复制构造函数在容器内创建数据的一个副本的过程。如果容器保存的是自定义类型,则最低要求该类型不能有一个私有的复制构造函数。
C++标准中对所有容器规定了一些基本要求。标准库中的所有容器都遵循这一系列要求。如果想要自定义容器也能用标准库中的算法,也要遵循这些要求。记C为容器类型,首先,容器中必须有若干与所存数据类型有关的嵌套定义类型,如下表所示:
以std::vector
typedef std::vector<my_data> vec ;
typedef typename vec::value_type data_type; // = my_data
typedef typename vec::reference ref_type; // = my_data&
typedef typename vec::const_reference cref_type; // = my_data const&;
typedef typename vec::size_type size_type; // = size_t;
上面的要求不是必须要满足的,比如vector
容器适配器
容器适配器提供顺序容器的不同接口。
span
span
是相接的对象序列上的非占有视图,某个其他对象占有序列的存储
迭代器非法化
只读方法决不非法化迭代器或引用。修改容器内容的方法可能非法化迭代器和/或引用,总结于此表格。
类别 | 容器 | 插入后…… | 擦除后…… | 条件 | ||
---|---|---|---|---|---|---|
迭代器合法? | 引用合法? | 迭代器合法? | 引用合法? | |||
顺序容器 | array | N/A | N/A | |||
vector | 否 | N/A | 插入更改容量 | |||
是 | 是 | 被修改元素前 | ||||
否 | 否 | 于被修改元素或其后 | ||||
deque | 否 | 是 | 是,除了被擦除元素 | 修改首或尾元素 | ||
否 | 否 | 仅修改中部 | ||||
list | 是 | 是,除了被擦除元素 | ||||
forward_list | 是 | 是,除了被擦除元素 | ||||
关联容器 | set | 是 | 是,除了被擦除元素 | |||
无序关联容器 | unordered_set | 否 | 是 | N/A | 插入导致重哈希 | |
是 | 是,除了被擦除元素 | 无重哈希 |
https://msdn.microsoft.com/zh-cn/library/1e4kz2ct.aspx#语法
https://msdn.microsoft.com/zh-cn/library/155esdxw.aspx
还没有评论,来说两句吧...