基于jsp网站开发开题报告,中国万网市值,百度怎么建立网站,idc网站模板源码下载一、相关介绍 STL 标准模板库在编写代码的过程中有一些程序经常会被用到#xff0c;而且需求特别稳定#xff0c;所以C中把这些常用的模板做了统一的规范#xff0c;慢慢的就形成了STL提供三种类型的组件: 容器、迭代器和算法#xff0c;它们都支持泛型程序设计标准容器 顺…一、相关介绍 STL 标准模板库在编写代码的过程中有一些程序经常会被用到而且需求特别稳定所以C中把这些常用的模板做了统一的规范慢慢的就形成了STL提供三种类型的组件: 容器、迭代器和算法它们都支持泛型程序设计标准容器 顺序容器vector、list、deque通过元素在容器中的位置顺序存储和访问元素关联容器set、map、multiset、multimap通过键Key存储和读取元素容器适配器stack、queue、priority_queue迭代器 一种检查容器内元素并遍历元素的数据类型每种容器类型都定义了自己的迭代器类型包括双向迭代器、随机迭代器二、容器 【顺序容器】 顺序容器中元素排列顺序与其值无关而仅仅由元素添加到容器里的次序决定容器内的元素类型必须至少满足2个条件可复制和可赋值所有的迭代器范围都是左闭右开区间begend 包括beg但不包括end标准库定义了三种顺序容器vectorlist和deque。 vector——连续存储的元素单向的 list——由节点组成的不连续存储的双向链表 deque——连续存储的元素双向的 它们的区别在于访问元素的方式以及添加或删除元素相关操作的运行代价。 如下图 【关联容器】 独特之处在于支持键的使用支持通过键来高效地查找和读取元素标准库定义了两种关联容器setmap set——仅含一个键并有效地支持关于某个键是否存在的查询 map——元素以键-值key-value对的形式组织键用作元素在map中的索引而值则表示所存储和读取的元素 一般来说如果希望有效的存储不同值的集合那么set容器比较合适而map容器则更适用于需要存储乃至修改每个键所关联值的情况。 在做某种文本处理时可使用set保存要忽略的单词。而字典则是map的一种很好的应用单词本身是键而它的解释说明则是值。 map和set类型的对象所包含的元素都具有不同的键不允许同一个键添加第二个元素。如果一个键必须对应多个实例则需要使用multimap和multiset类型。 【容器适配器】 不是第一类容器没有提供与元素的保存形式有关的真正数据结构实现适配器都是建立在某个顺序容器之上的适配器不支持迭代器优点能够使程序员选择一种合适的底层数据结构STL提供了三种容器适配器stack,queue,priority_queue。 statck——可以建立在vector,list,deque任何一种容器之上queue——要求关联容器提供front操作所以只有list和deque满足priority_queue——要求提供随机访问功能 所有只有vector和deque满足 stack类允许在底层数据结构的一端执行插入和删除操作先入后出。堆栈能够用任何顺序容器实现vector、list、deque。queue类允许在底层数据结构的末尾插入元素也允许从前面插入元素先入先出。队列能够用STL数据结构的list和deque实现默认情况下是用deque实现的。priority_queue类能够按照有序的方式在底层数据结构中执行插入操作也能从底层数据结构的前面执行删除操作。priority_queue能够用STL的序列容器vector和deque实现。默认情况下使用vector作为底层容器的。当元素添加到priority_queue时它们按优先级顺序插入。这样具有最高优先级的元素就是从priority_queue中首先被删除的元素。通常这是利用堆排序来实现的。堆排序总是将最大值即优先级最高的元素放在数据结构的前面。这种数据结构称为heap。 三、迭代器 一、迭代器的变化 和vector、list不同set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高因为只需要修改相关指针而不用进行数据的移动。 在进行数据删除操作后迭代器会不会失效呢删除set的数据时实际的操作是删除红黑树中的一个节点然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置并没有改变所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素vector中其他迭代器会失效因为vector是基于数组的删除一个元素后后面的元素会往前移动所以指向后面元素的迭代器会失效。 二、迭代器的实现 迭代器是一个对象vector的迭代器是封装了数组下标list、map、set的迭代器是封装了元素节点的指针。 还有一点从数学层面set的一个集合好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树set中的元素根据其值的大小在红黑树中有特定的位置是不可移动的。所以1是search操作效率会很高O(log n)2是set中元素的值不可改变。 【小问题】 set是基于红黑树实现的那么set的迭代器begin()、end()是指向哪里的呢 一个测试程序 #includeiostream
#includeset
using namespace std;
int main(){setint myset;myset.insert(4);myset.insert(7);myset.insert(2);myset.insert(0);myset.insert(4);setint::iterator it;for(it myset.begin(); it ! myset.end(); it){cout *it; //输出结果是0247}
}红黑树首先是二叉搜索树所以begin()迭代器指向红黑树的最左边的节点end()迭代器指向红黑树的最右边的节点。另外这个小程序还说明了重复插入无效。 (1)STL中迭代器容器中都要注意的地方(vector中已经提到)1任何时候同时使用两个迭代器产生的将会是一个前闭后开的区间(具体见插入和删除的例子)2begin()指向的是vec中的第0个元素而end是指向最后一个元素的后面一个位置不是最后一个元素3迭代器的时效性如果一个迭代器所指向的内容已经被删除而后又使用该迭代器的话会造成意想不到的后果 (2)list的迭代器是双向迭代器(只能 --没有偏移功能)而不是像vector那样的随机迭代器(和指针几乎一样的所有功能) 在list中由于其内存是非连续的因此不能像vector那样用[]操作符取值只能用迭代器。 (3)list和vector的区别本质区别list是链式存储vector在内存中是连续区别的有本质区别而导致下面区别 1list不支持随机访问(2)中已经说明,vector可以像数组那样使用平[]访问元素而list是不可以的 2) list的插入和删除效率很高所以list有push_front、pop_front、sort而vector中这些操作的效率太低了所以STL中没有写这些功能 与vector相比list除了有push_back()//在尾部插入 和 insert()之外还有push_front()//即在链表的头部插入 3list的一些特有的函数remove、reverse、unique、splice、merge功能(这些连deque中都没有的)转载于:https://www.cnblogs.com/xzxl/p/7277261.html