什么是STL (什么是ST股票?什么是*ST股票?)
本文目录导航:
什么是STL
它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发 出来的。
现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的 一段时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator( 迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数 和类组成的库来说提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个 头文件:、、、、、、、、、、、和。
以下笔者就简单 介绍一下STL各个部分的主要特点。
二、算法 大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用 。
举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯 定比使用整型作为它的参数类性要高。
而C++通过模板的机制允许推迟对某些类型的选择 ,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多 的有用算法。
它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为 少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个 元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
这样 一来,只要我们熟悉了STL之后,许多代码可以被大大的化简,只需要通过调用一两个算 法模板,就可以完成所需要的功能并大大地提升效率。
算法部分主要由头文件,和组成。
是所 有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认 为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找 、遍历操作、复制、修改、移除、反转、排序、合并等等。
体积很小,只包括 几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
中则定义了一些模板类,用以声明函数对象。
三、容器 在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性 ,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。
经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写 的代码,这些代码都十分相似,只是为了适应不同数据的变化而在细节上有所出入。
ST L容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型 下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模 板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化 。
容器部分主要由头文件,,,,,和组成 。
对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下 表总结一下它们和相应头文件的对应关系。
数据结构 描述 实现头文件 向量(vector) 连续存储的元素列表(list) 由节点组成的双向链表,每个结点包含着一个元素双队列(deque) 连续存储的指向不同元素的指针所组成的数组集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于 元素对的谓词排列,没有两个不同的元素能够拥有相同的次序多重集合(multiset) 允许存在两个次序相等的元素的集合栈(stack) 后进先出的值的排列队列(queue) 先进先出的执的排列优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的 一种队列映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列多重映射(multimap) 允许键对有相等的次序的映射四、迭代器 下面要说的迭代器从作用上来说是最基本的部分,可是理解起来比前两者都要费力一些 (至少笔者是这样)。
软件设计有一个基本原则,所有的问题都可以通过引进一个间接 层来简化,这种简化在STL中就是用迭代器来完成的。
概括来说,迭代器在STL中用来将 算法和容器联系起来,起着一种黏和剂的作用。
几乎STL提供的所有算法都是通过迭代器 存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器 中的元素。
迭代器部分主要由头文件,和组成。
是一个很小 的头文件,它包括了贯穿使用在STL中的几个模板的声明,中提供了迭代器使 用的许多方法,而对于的描述则十分的困难,它以不同寻常的方式为容器中的 元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,中的 主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
五、对初学者学习STL的一点建议 对于之前不太了解STL的读者来说,上面的文字只是十分概括地描述了一下STL的框架, 对您理解STL的机制乃至使用STL所起到的帮助微乎甚微,这不光是因为深入STL需要对C ++的高级应用有比较全面的了解,更因为STL的三个部分算法、容器和迭代器三部分是互 相牵制或者说是紧密结合的。
从概念上讲最基础的部分是迭代器,可是直接学习迭代器 会遇到许多抽象枯燥和繁琐的细节,然而不真正理解迭代器又是无法直接进入另两部分 的学习的(至少对剖析源码来说是这样)。
可以说,适应STL处理问题的方法是需要花费 一定的时间的,但是以此为代价,STL取得了一种十分可贵的独立性,它通过迭代器能在 尽可能少地知道某种数据结构的情况下完成对这一结构的运算,所以下决心钻研STL的朋 友们千万不要被一时的困难击倒。
其实STL运用的模式相对统一,只要适应了它,从一个 STL工具到另一个工具,都不会有什么大的变化。
对于STL的使用,也普遍存在着两种观点。
第一种认为STL的最大作用在于充当经典的数 据结构和算法教材,因为它的源代码涉及了许多具体实现方面的问题。
第二种则认为ST L的初衷乃是为了简化设计,避免重复劳动,提高编程效率,因此应该是“应用至上”的 ,对于源代码则不必深究。
笔者则认为分析源代码和应用并不矛盾,通过分析源代码也 能提高我们对其应用的理解,当然根据具体的目的也可以有不同的侧重。

c++中迭代器是什么意思?
容器就是数据结构的泛指,迭代器就是指针的泛指,可以指向元素。
容器相当于一个储藏柜,里面装的许多不同的物品就像是储存的元素,比如面包、啤酒、苹果、现金。
要取得各个物体就得用与各个物体向匹配的工具,如取出面包要用盘子、取出啤酒要用杯子、取出苹果要用篮子、取出现金要用钱包。
迭代器的作用就相当于取出物品的工具的抽象,通过迭代器泛指现实生活中从贮藏室中取出物体的工具。
C++迭代器是一种检查容器内元素并遍历元素的数据类型。
1 Iterator definitionsIn C++, an iterator is any object that, pointing to some element in a range of elements (such as an array or a container), has the ability to iterate through the elements of that range using a set of operators (at least, the increment (++) and dereference (*) operators). The most obvious form of iterator is a pointer: A pointer can point to elements in an array, and can iterate through them using the increment operator (++). But other forms of iterators exist. For example, each container type (such as a vector) has a specific iterator type designed to iterate through its elements in an efficient way.C++迭代器Interator就是一个指向某种STL对象的指针。
通过该指针可以简单方便地遍历所有元素。
C++中的iterator为STL中的重要概念。
iterator的概念源自于对遍历一个线性容器工具的抽象,即如何你能访问这个容器的某个元素。
对于最简单的数组,当然可以用数组的索引值,因为数组是连续存放在内存中的;但对于链表,就必须用指针。
除此之外,还有还有很多种数据结构需要提供一个方便的工具来访问其中的元素,方法有ID,关键字等等。
为了统一所有的容器的这种工具的使用,一般提供一整套容器的开发者就会用一种方式来表示各种容器的访问工具。
例如C++ STL就是使用iterator。
MFC自己的容器使用position。
C#和java也有自己的方法,但方法是不变的。
iterator的用法可以被统一,但不同的底层容器实现其iterator的原理是不一样的。
例如iterator++你可以理解为移动到容器的下一个元素,如果底层如果是数组,把索引值加一就行;如果底层是链表,就得执行类似于m_pCurrent = m_pCurrent-> pNext;的操作。
因此每种容器都有自己的iterator实现方法。
C++ STL iterator的常用方法有: iterator++ 移到下个元素 iterator-- 移到上个元素 *iterator 访问iterator所指元素的值 < > == != iterator之间的比较,例如判断哪个元素在前 iterator1 + iterator2 iterator之间的加法运算,类似于指针加法 2 容器的 iterator 类型每种容器类型都定义了自己的C++迭代器类型,如 vector:vector<int>::iterator iter;这符语句定义了一个名为 iter 的变量,它的数据类型是 vector<int> 定义的 iterator 类型。
每个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义相同。
begin 和 end 操作每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。
如果容器中有元素的话,由 begin 返回的迭代器指向第一个元素: vector<int>::iterator iter = ();上述语句把 iter 初始化为由名为 vector 操作返回的值。
假设 vector 不空,初始化后,iter 即指该元素为ivec[0]。
由end 操作返回的C++迭代器指向 vector 的“末端元素的下一个”。
“超出末端迭代器”(off-the-end iterator)。
表明它指向了一个不存在的元素。
如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。
由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。
a)使用迭代器读取vector中的每一个元素vector<int> ivec(10,1); for(vector<int>::iterator iter=();iter!=();++iter){*iter=2; //使用 * 访问迭代器所指向的元素}b)const_iterator只能读取容器中的元素,而不能修改for(vector<int>::const_iterator citer=();citer!=();citer++){cout<<*citer; //*citer=3; error}3 vector 迭代器的自增和解引用运算C++迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。
迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:*iter = 0;解引用操作符返回迭代器当前所指向的元素。
假设 iter 指向 vector 对象 ivec 的第一元素,那么 *iter 和ivec[0] 就是指向同一个元素。
上面这个语句的效果就是把这个元素的值赋为 0。
迭代器使用自增操作符向前移动迭代器指向容器中下一个元素。
从逻辑上说,C++迭代器的自增操作和int 型对象的自增操作类似。
对 int 对象来说,操作结果就是把 int 型值“加 1”,而对迭代器对象则是把容器中的迭代器“向前移动一个位置”。
因此,如果 iter 指向第一个元素,则 ++iter 指向第二个元素。
由于 end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。
libcstllibcstl基本概念
libcstl是一个强大的C++标准库,它由多个组件组成,包括容器、迭代器、算法和函数。
这个库的目的是提供高效、灵活的数据结构和操作工具。
容器是libcstl的核心,它们以某种结构形式管理数据的集合。
容器包括序列容器和关联容器。
序列容器,如vector_t、list_t、deque_t和slist_t,用于存储和管理数据,数据的顺序与插入顺序相关,与数据本身无关。
关联容器,如set_t、map_t、multiset_t、multimap_t、hash_set_t、hash_map_t、hash_multiset_t和hash_multimap_t,更关心数据的排列顺序,数据的顺序与数据本身有关,与插入顺序无关。
除了这些基本容器,libcstl还提供了容器适配器,如stack_t、queue_t和priority_queue_t,用于特定目的。
迭代器与容器相关联,应用在容器或容器的子集上。
它的主要优点是提供了一个统一的接口,使得算法可以独立于特定的容器。
迭代器作为容器和算法之间的桥梁,允许算法在任意容器上操作。
同时,算法还利用特定的函数对容器中的数据进行特定操作。
函数在libcstl中扮演着定义算法中使用的函数形式的角色,并定义了一些算法中常用的函数,可以作为算法的自定义规则。
例如,string_t类型提供了一种方便的方式来拷贝、赋值、比较字符串,而无需考虑内存分配或边界检查问题。
字符串可以动态增长,易于插入、删除字符或子串,方便地进行替换等操作。
在libcstl中,算法提供了多种处理数据的方法,如查找、排序、拷贝、修改和算术操作。
这些算法都是以迭代器作为输入,从而实现了算法的通用性,能够在任何容器上执行操作。
此外,libcstl还提供了大量的函数,它们主要用来为算法提供扩展功能。
每个算法都有一个后缀为if的版本,接受函数作为操作的规则。
用户还可以自定义函数来扩展算法功能,以满足特定需求。
总之,libcstl是一个功能丰富、高度可定制的C++标准库,它通过容器、迭代器、算法和函数提供了高效的数据管理、操作和处理能力,为开发者提供了强大的工具集。扩展资料
libcstl是使用标准C编写的通用的数据结构和常用算法的库, 它模仿STL的接口形式, 包括序列容器,关联容器,容器适配器,迭代器,函数,算法等为C编程中的数据管理提供了方便易用的程序库。
libcstl分为容器,迭代器,函数和算法四部分,此外2.0版本还添加了类型机制,这是一种为用户提供了方便使用自定义类型的机制。