C++标准库
文章平均质量分 77
lanzhihui_
!
展开
-
C++标准库---容器作为形参?
通常,函数不应该有 vector 或其他标准库容器类型的形参。调用含有普通的非引用 vector 形参的函数将会复制 vector 的每一个元素。因此,调用含有普通的非引用vector作为形参的函数,无论效率还是资源利用率,都是极大的浪费。从避免复制 vector 的角度出发,应考虑将形参声明为引用类型。但是,事实上,C++ 程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器:原创 2015-04-29 20:05:27 · 1904 阅读 · 0 评论 -
C++标准库---使用reserve来避免不必要的重新分配
对于vector和string来说,当它们的需要更多空间时,就会自动增加空间,而每次增加空间的容量会导致很大的开销,首先必须分配新的内存块,它有容器目前容量的几倍(在大部分实现中,vector和string的容量每次变为2倍),然后把所有元素从容器的旧内存拷贝到它的新内存,接着销毁旧内存中的对象,最后回收旧内存。 看到以上的那些步骤,我不禁对容器自动扩大空间的性能感到担忧,不仅如此,每原创 2015-02-03 14:23:07 · 6427 阅读 · 0 评论 -
C++标准库---已序区间算法之一binary_search()&includes()
在已序区间中搜寻某元素检查某个元素是否存在bool binary_search(beg,end,const T& value)bool binary_search(beg,end,const T& value,op)(1)两种形式都用来判断已序区间[beg,end)中是否包含“和value等值”的元素;(2)op是一个可有可无的二元判断式,用来作为排序准则:原创 2014-12-27 15:12:20 · 3645 阅读 · 0 评论 -
C++标准库---排列元素next_permutation()&prev_permutation()
bool next_permutation(beg,end)bool prev_permutation(beg,end)next_permutation()会改变区间[beg,end)内的元素次序,使它们符合“下一个排列次序”;prev_permutation()会改变区间[beg,end)内的元素次序,使它们符合“上一个排列次序”;如果元素得以排列成(就字典顺序而言的)"原创 2014-12-26 16:50:30 · 1175 阅读 · 0 评论 -
C++标准库---heap算法
heap算法就排序而言,heap是一种特别的元素组织方式,应用于heap排序法。heap可被视为一个序列式群集实作而成的二叉树,具有两大性质:1.第一个元素总是最大;2.总是能够在对数时间内增加或移除一个元素。STL提供四种算法:1.make_heap() 将区间内的元素转换为heap2.push_heap() 对着heap增加一个元素3.pop_heap(原创 2014-12-23 23:12:01 · 1857 阅读 · 0 评论 -
C++标准库---逆转元素reverse()&reverse_copy()
逆转元素次序reverse(beg,end)reverse_copy(sourceBeg,sourceEnd,destBeg)reverse()会将区间[beg,end)内的元素全部逆序;reverse_copy()会将源区间[sourceBeg,sourceEnd)内的元素复制到"以destBeg起始的目标区间",并在复制过程中颠倒安置次序;reverse_copy(原创 2014-12-26 13:02:47 · 16300 阅读 · 0 评论 -
C++标准库---旋转元素rotate()&rotate_copy()
旋转元素次序rotate(beg,newBeg,end)将区间[beg,end)内的元素进行旋转,执行后*newBeg成为新的第一元素;调用者必须确保newBeg是区间[beg,end)内的一个有效位置,否则会引发未定义的行为;复杂度:线性代码示例:#include"fuzhu.h"using namespace std;int main(){原创 2014-12-26 13:10:58 · 5176 阅读 · 0 评论 -
C++标准库---已序区间算法之二lower_bound()&upper_bound()&equal_range()
搜索第一个或最后一个可能位置lower_bound(beg,end,const T& value)lower_bound(beg,end,const T& vlaue,op)upper_bound(beg,end,const T& value)upper_bound(beg,end,const T& value,op)(1)lower_bound()返回第一原创 2014-12-27 19:28:42 · 1147 阅读 · 0 评论 -
C++标准库---Reverse(逆向)迭代器
Reverse(逆向)迭代器Reverse迭代器是一种配接器,重新定义递增递减运算,使其行为正好倒置,这样使迭代器以逆向来处理元素。rbegin:传回逆向遍历的第一个元素,也就是实际上最后一个元素的位置;rend:传回逆向遍历时最后一个元素的下一个位置,也就是实际上第一个元素的前一个位置;代码示例:#include#include#include#incl原创 2014-12-08 20:21:25 · 1475 阅读 · 0 评论 -
C++标准库---advance()&distance()&iter_swap()
advance:void advance(pos,n);1.使名为pos的input迭代器步进(或步退)n个元素;2.对Bidirectional迭代器和Random Access迭代器而言,n可为负值,表示向后退;3.advance()并不检查迭代器是否超过序列的end()(因为迭代器通常不知道其所操作的容器,因此无从检查)。所以,调用advance()有可能导致未定义行为---原创 2014-12-08 16:49:44 · 4874 阅读 · 0 评论 -
C++标准库---for_each()用法及回返值
for_each()用法及回返值:#include#include#includeusing namespace std;class MeanValue{private: long num; long sum;public: MeanValue():num(0),sum(0){} void operator()(int elem) { num++; sum原创 2014-12-09 21:29:52 · 2608 阅读 · 0 评论 -
C++标准库---partial_sort()&partial_sort_copy()
局部排序:partial_sort(beg,sortEnd,end)partial_sort(beg,sortEnd,end,op)1.以上第一种形式,以operator2.以上第二中形式,运用二元判断式:op(elem1,elem2)对区间[beg,end)内的元素进行排序,使区间[beg,sortEnd)内的元素处于有序状态。3.和sort(原创 2014-12-22 21:37:08 · 1372 阅读 · 0 评论 -
C++标准库---成员函数配接器
针对成员函数而设计的函数配接器C++标准库提供了一些额外的函数配接器,通过他们,就可以对群集内的每一个元素调用其成员函数。配接器:mem_fun_ref(op) 调用op,那是某对象的一个const成员函数mem_fun(op) 调用op,那是某对象指针的一个const成员函数代码示例:#include#include#include#includ原创 2014-12-12 16:21:52 · 885 阅读 · 0 评论 -
C++标准库---迭代器失效之正确的插入和移除元素
学习了这么久的C++变准库,怎么还不会正确的插入和移除元素呢?之前移除特定值的元素,我们通过算法earse()和remove()都能成功执行了,可是对于这些算法来说,内部迭代器怎么工作,我们不需要管,只知道对于序列式容器,它会遍历整个容器,找到符合条件的元素并移除,对于关联式容器,可以在对数时间里移除特定值的元素,移除满足特定条件的元素,同样需要遍历整个容器。那么,现在如果要移除并输出要移除的原创 2015-02-03 14:19:27 · 1391 阅读 · 1 评论 -
STL中的vector应用---简单通讯录
在vector中放入结构体数据,对结构体数据进行管理。//通讯录#include#include#include#includeusing namespace std;struct txl{ string phone; string name;};vector host;txl new_lxr;void insert_lxr(){ cout<<"请原创 2015-01-25 18:30:01 · 841 阅读 · 0 评论 -
C++标准库---set中的结构体
set是一个关联式容器,存储的元素必须按照一定的规则排序,那么如果是一个结构体参数,或者类参数,按照那一个标准进行排序插入呢?下面代码示例:#include#include#include#include#includeusing namespace std;class Student{public: Student(){} Student(string iname原创 2015-01-25 18:39:38 · 2287 阅读 · 0 评论 -
C++标准库---stack
stack(堆栈)STL中为了满足一些特定的需求,设计了一些特殊的容器,这些容器提供简单而清晰的接口,例如stack。stack必须满足先进后出的原则,定义在头文件中,namespace std{ template > class stack;}第一个template参数代表元素型别。带有默认值的第二个template参数用来定义stack内部存放元素所有的实际容原创 2015-01-05 18:52:01 · 4084 阅读 · 0 评论 -
C++标准库---queue
queuequeue的核心接口主要由成员函数push(),front(),back(),pop()构成;push():会将一个元素置入queue中;front():会返回queue内的第一个元素(也就是第一个被置入的元素)back():会返回queue中的最后一个元素(也就是最后被插入的元素)pop():会移除queue内的第一个元素(也就是第一个被置入的元素)原创 2015-01-05 20:12:10 · 10679 阅读 · 0 评论 -
C++标准库---copy()©_backward()
复制元素copy(sourceBeg,sourceEnd,destBeg)copy_backward(sourceBeg,sourceEnd,destEng)(1)这两个算法都将源区间[sourceBeg,sourceEnd)中的所有元素复制到以destBeg为起点或destEnd为终点的目标区间去;(2)返回目标区间内最后一个被复制元素的下一位置,也就是第一个未被覆盖原创 2015-01-01 22:37:30 · 1476 阅读 · 0 评论 -
C++标准库---transform()
transform算法transform()提供以下两种能力:1.第一形式有4个参数,把源区间的元素转换到目标区间。也就是说,复制和修改元素一气呵成;2.第二形式有5个参数,将前两个源序列中的元素合并,并将结果写入目标区间。注意:含有修改元素,仅仅只做复制元素,可以使用copy()。第一种形式transform(sourceBeg,sourceEnd,destB原创 2015-01-02 18:27:54 · 5414 阅读 · 1 评论 -
C++标准库---赋予新植fill()&generate()
赋予新值赋予完全相同的数值fill(beg,end,const T& value) fill_n(beg,num,const T& value) (1)fill()将区间[beg,end)内的每一个元素都赋予新植newValue;(2)fill_n()将“从beg开始的前num个元素”赋予新植newValue;(3)调用者必须确保目标区间有足够空间,原创 2015-01-03 11:11:44 · 842 阅读 · 0 评论 -
C++标准库---替换元素replace()&replace_if()
替换元素替换序列内的元素replace(beg,end,const T& oldValue,const T& newValue)replace_if(beg,end,op,const T& newValue)(1)replace()将区间[beg,end)之内每一个“与oldValue相等”的元素替换为newValue;(2)replace_if()将区间[beg,原创 2015-01-03 13:00:42 · 4710 阅读 · 0 评论 -
C++ 标准库---移除性算法之二移除重复元素
移除重复元素移除连续重复元素unique(beg,end)unique(beg,end,op)(1)以上两种形式都会移除连续重复元素中的多余元素;(2)第一种形式将区间[beg,end)内所有“与前一元素相等”的元素移除;(3)两种形式都返回被变动后的序列新终点(也就是最后一个“未被移除的元素”的下一个位置);(4)这两个算法将“原本位置在后”的未被原创 2014-12-31 16:21:40 · 1144 阅读 · 0 评论 -
C++标准库---已序算法之三合并元素
合并元素两个已序集合的总和merge(source1Beg,source1End,source2Beg,source2End,destBeg)merge(source1Beg,source1End,source2Beg,source2End,destBeg,op)(1)两者都将源区间[source1Beg,source1End)和[source2Beg,sour原创 2014-12-31 10:18:28 · 826 阅读 · 0 评论 -
C++标准库---移除性算法之一remove()&remove_if()
移除性算法 本系列所有算法根据元素值或某一准则,在一个区间内移除某些元素。这些算法并不能改变元素的数量,它们只是以逻辑上的思考,将原本置于后面的“不移除元素”向前移动,覆盖那些被移除元素而已,它们都返回新区间的逻辑终点(也就是最后一个“不移除元素”的下一位置)。移除某些特定元素remove(beg,end,cosntt T& value)remove_if原创 2014-12-31 12:26:49 · 7879 阅读 · 0 评论 -
C++标准库---sort()&stable_sort
sort(beg,end)sort(beg,end,op)stable(beg,end,)stable(beg,end,op)1.sort()与stable_sort()的上述第一形式,使用operator2.sort()与stable_sort()的上述第二形式,使用二元判断式op(elem1,elem2)作为排序准则,对区间[beg,end)内的所有元素进行原创 2014-12-22 20:29:24 · 1303 阅读 · 0 评论 -
C++标准库---序列式容器的移除算法
remove 移除(但不删除)移除[fist,last)之中所有与value相等的元素。这一算法并不真正从容器中删除那些元素(换句话说容器大小并未改变),而是将每一个不与value相等(也就是不打算移除)的元素轮番赋给first之后的空间。返回值ForwardIterator标示出重新整理后的最后元素的下一位置。如果要删除那些残余数据,可将返回的迭代器交给所在容器的erase(原创 2015-01-29 12:40:17 · 760 阅读 · 0 评论 -
C++标准库---STL三大序列容器vector&deque&list
下面介绍以下STL三大序列容器:vector:原创 2014-11-23 21:44:14 · 1413 阅读 · 0 评论 -
C++标准库---map&multimap
使用map和multimap需要注意以下几点:1.map和multimap将key/value(键值/实值 对组)当做元素,进行管理。它们可根据key的排序准则自动将元素元素排序。multimap允许重复元素,map不允许。2.map的第一个参数被当做元素的key,第二个参数被当做元素的value,第三个参数用它来定义排序准则。元素的次序由它们的key决定,和value无关。3.map原创 2014-11-30 20:53:00 · 2372 阅读 · 0 评论 -
C++标准库---list使用注意事项
list使用需要注意的几点:1.list不支持随机存取,即如果你要存取第5个元素,你必须顺着串链一一爬过前4个元素,所以在list中随机遍历任意元素,是很缓慢的行为;2.任何位置(不只是两端)执行元素的安插和删除都非常快,始终是常数时间内完成,因为无需移动任何其他元素,实际上内部只是进行了一些指针操作而已;3.安插和删除动作并不会造成指向其他元素的各个pointers,referenc原创 2014-11-29 14:33:02 · 2125 阅读 · 0 评论 -
C++标准库---vector使用注意事项
使用vector需要注意的地方1.vector支持随机存取,因此你只要知道元素的位置,可以在常数时间内存取任何一个元素;2.在末端附加或删除元素,vector的性能相当好,但是在前端或中部安插或删除元素,性能就不行了,因为操作点之后的每一个元素都必须向后移动,而每一次移动都得调用assignment(赋值)操作符;3.合适的vector大小(size)很重要,因为capacity()返原创 2014-11-29 12:34:41 · 2897 阅读 · 0 评论 -
C++标准库---deque使用注意事项
deque需要注意的几点:1.两端都能快速安插元素和移除元素,这些操作可以在常数时间内完成;2.deque内部结构会多一个间接过程,存取元素动作会稍微慢一点;3.迭代器需要在不同区块间跳转,所以必须使用特殊的智能型指针,非一般指针;4.duque不支持对容量和内存重分配时机的控制,除了头尾两端,在任何地方安插或删除元素,都将导致指向deque元素的任何references,poin原创 2014-11-29 13:25:26 · 2048 阅读 · 1 评论 -
C++标准库---迭代器
迭代器是一个“可遍历STL容器内全部或部分元素”的对象。原创 2014-11-24 21:20:01 · 772 阅读 · 0 评论 -
C++标准库---auto_ptr实现原理
auto_ptr是一个Template class,它的具体实现细节,可以参考以下://auto_ptr实做细目#includeusing namespace std;templateclass my_auto_ptr{private: T* ap;public: typedef T element_type; explicit my_auto_ptr(T* ptr=原创 2014-11-23 16:35:22 · 1400 阅读 · 2 评论 -
C++标准库---智能指针auto_ptr初探
智能指针auto_ptrC++标准库ti'go原创 2014-11-22 21:10:46 · 826 阅读 · 0 评论 -
C++标准库---const auto_ptr特性
在使用auto_ptr的时候很容易就会发生拥有权的转移,原创 2014-11-23 14:28:00 · 903 阅读 · 0 评论 -
C++异常处理机制详细说明
异常处理的一些说明异常处理的语法throw语句的语法: throw 表达式;try-catch的结构为: try{ 被检查的语句;}catch(异常信息的类型[变量名]){ 进行异常处理的语句;}说明:1.被检测的部分必须放在try块中,否则不起作用。2.try块和catch块作为一个整体出现,catc原创 2014-11-19 20:27:35 · 1283 阅读 · 0 评论 -
C++标准库---pair用法及实现
pair的类型: pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair p; pair p; pair p;也可以将自己写的struct的对象放进去应用:如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个str原创 2014-11-22 16:39:33 · 11044 阅读 · 0 评论 -
C++标准库---容器、迭代器、算法、仿函数
容器:用来管理某类对象的集合,不同容器有不同的优缺点,所以正确使用不同的容器,可以获得容器带来的各种好处,但是如果使用不正确,就势必会造成很多麻烦,甚至造成错误。迭代器:用来对一个对象群集的所有元素进行遍历动作,所以迭代器是容器的一个很小的接口,利用这个接口,就可以遍历容器内的元素,至于怎么做到遍历元素,应该取决于元素内部存储结构,而不同容器存储结构不同,所以每一种容器都提供了自己的迭原创 2014-11-29 15:05:09 · 1412 阅读 · 0 评论 -
C++标准库---仿函数
概念 仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 有些功能的的代码,会在不同的成员函数中用到,想复用这些代码。 1)公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变原创 2014-11-29 21:38:58 · 887 阅读 · 0 评论