STL问题分析
文章平均质量分 70
面向对象 修修补补
用心做好每一件事
展开
-
如何把vector和string数据传给旧的C API
通常情况下,旧的C API使用数组合char*指针来进行数据交换而不是vector或string对象。这样的API还将存在很长的一段时间,如果我们想有效地使用STL,我们就必须与它们和平共处。幸运的是,这很容易做到。如果有一个vector v,而需要得到一个指向v中数据的指针,从而可把v中的数据作为数组来对待,那么只需要使用&v[0]就可以了。对于string s,对应的形原创 2014-06-24 22:40:56 · 949 阅读 · 0 评论 -
切勿创建包含auto_ptr的容器对象
当你拷贝一个auto_ptr时,它所指向的对象的所有权被移交到拷入的auto_ptr上,而它自身被置为NULL。我的理解是:拷贝一个auto_ptr意味着改变它的值。例如:auto_ptr pint1(new int);//pint1指向一个intauto_ptr pint2(pint1);//pint2指向pint1的int;pint1被置为NULLpint1原创 2014-08-07 00:06:12 · 884 阅读 · 0 评论 -
STL中慎重选择删除元素的方法
一、要删除容器中有特定值的所有对象1、如果容器是vector、string或deque,则使用erase-remove习惯用法。例如:vector c;c.erase(remove(c.begin(),c.end(),1963),c.end());//删除值是1963的元素下面讲一下算法remove:templateForwardIterat原创 2014-08-07 00:07:48 · 1130 阅读 · 0 评论 -
容器set相关算法
set_union算法set_union可构造S1、S2的并集。此集合内含S1或S2内的每一个元素。S1、S2及其并集都是以排序区间表示。返回值是一个迭代器,指向输出区间的尾端。由于S1和S2内的每个元素都不需唯一,因此,如果某个值在S1出现n次,在S2出现m次,那么该值再输出区间中会出现max(m,n)次,其中n个来自S1,其余来自S2。在STL se原创 2014-06-19 00:02:46 · 969 阅读 · 0 评论 -
copy算法
copy------强化效率无所不用其极copy(first,last,result)算法可将输入区间[first,last)内的元素复制到输出区间[result,result+(last-first))内。也就是说,它会执行赋值操作*result =*first,*(result+1) =*(first+1),…一次类推。返回一个迭代器:result+(last-原创 2014-06-18 23:04:36 · 845 阅读 · 0 评论 -
函数调用操作符(operator())
许多STL算法都需要用户指定某个条件或某个策略,而条件或策略的背后由一整组操作构成,便需要某种特殊的东西来代表这“一整组操作”。代表“一整组操作”的,当然是函数。过去C语言时代,欲将函数当做参数传递,唯有通过函数指针才能达成。但是函数指针有缺点,最重要的是它无法持有自己的状态(所谓局部状态),也无法达到组件技术中的可适配性(adaptablity)-----也就是无法再将某些修原创 2014-06-18 23:29:04 · 1499 阅读 · 0 评论 -
前闭后开区间表示法
任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标识的区间,用以表示操作范围。这一对迭代器所标示的是个所谓的前闭后开区间,以[first,last)表示。也就是说,整个实际范围从first开始,知道last-1。迭代器last所指的是“最后一个元素的下一位置”。这种偏移一格的标示法,带来了许多方便,例如下面两个STL算法的循环设计,就显得干净利落:template原创 2014-06-18 23:26:17 · 3948 阅读 · 0 评论 -
transform算法
transform()的第一版本以仿函数op作用于[first,last)中的每一个元素身上,并以其结果产生出一个新序列。第二版本以仿函数binary_op作用于一双元素身上(其中一个元素来自[first1,last1),另一个元素来自“从first2开始的序列”),并以其结果产生出一个新序列。如果第二序列的元素少于第一序列,执行结果未可预期。//版本一template Out原创 2014-06-25 22:16:29 · 1281 阅读 · 0 评论 -
调用empty()而不是检查size()是否为0
对任一容器C,代码if (c.size()== 0)本质上与if (c.empty())是等价的。既然如此,为什么要偏向于某一种形式呢,尤其是考虑到empty()通常被实现为内联函数,并且它所做的仅仅是返回size()是否为0。理由很简单:empty()对所有的标准容器都是常数时间操作,而对一些list实现,size()耗费线性时间。原因:在所有的标准容器中,只有l原创 2014-06-25 22:33:19 · 1132 阅读 · 0 评论 -
STL中heap算法(堆算法)
①push_heap算法下面是push_heap算法的实现细节。该函数接收两个迭代器,用来表现一个heap底部容器(vector)的头尾,并且新元素已经插入到底部的最尾端。template inline void push_heap(RandomAccessIterator first,RandomAccessIterator last){ //注意,此函数被调用时,新原创 2014-06-28 08:32:17 · 938 阅读 · 0 评论 -
vector和string优先于动态分配的数组
每次当你发现自己要动态的分配一个数组时(例如想写“new T[]”时),你都应该考虑用vector和string来代替。一般情况下,当T是字符类型时用string,否则用vector。不过在一种特殊的情况下,vector可能是一种更为合理的选择。许多string实现在背后使用了引用计数技术,这种策略可以消除不必要的内存分配和不必要的字符拷贝,从而可以提高很多应用程序的效率。可惜原创 2014-06-25 22:50:09 · 620 阅读 · 0 评论 -
STL中排序算法的选择
当大多数程序员需要对一组对象进行排序的时候,首先想到的一个算法是sort。sort是一个非常不错的算法,但它也并非在任何场合下都是完美无缺的。有时候我们并不需要一个完全的排序操作。比如说,如果我们有一个存放Widget的矢量,而我们希望将质量最好的20个Widget送给最重要的顾客,按照顾客的重要程度送上不同质量的Widget,那么只需要排序出前20个最好的Widget,其他的Widget原创 2014-06-25 22:55:04 · 849 阅读 · 0 评论 -
区间成员函数优先于与之对应的单元素成员函数
例子:使v1的内容和v2的后半部分相同的最简单操作是什么?看下面四个答案:①v1.assign(v2.begin()+v2.size()/2,v2.end());②v1.clear(); copy(v2.begin()+v2.size()/2,v2.end(),back_inserter(v1));③v1.insert(v1.end(),v2.begin原创 2014-06-25 22:38:49 · 651 阅读 · 0 评论 -
使用reserve来避免不必要的重新分配
关于STL容器,最了不起的一点是,它们会自动增长以便容纳下你放入其中的数据,只要没有超出它们的最大限制就可以。对于vector和string,增长过程是这样来实现的:每当需要更多空间时,就调用与realloc类似的操作。这一类似于realloc的操作分为4部分:分配一块大小为当前容量的某个倍数的新内存。在大多数实现中,vector和string的容量每次以2的原创 2014-06-24 22:35:40 · 869 阅读 · 0 评论 -
避免使用vector<bool>
作为一个STL容器,vector只有两点不对。首先,它不是一个STL容器。其次,它并不存储bool。除此之外,一切正常。一个对象要成为容器,就必须满足C++标准中列出的所有条件,其中一个条件是,如果c是包含对象T的容器,而且c支持operator[],那么下面的代码必须能够被编译:T *p = &c[0];换句话说,如果用operator[]取得了contain原创 2014-06-24 22:50:34 · 1201 阅读 · 0 评论 -
使用“swap技巧”除去多余的容量
当我们需要从矢量中删除一些元素,通常是通过调用区间形式的erase。这很好的缩减了改矢量的大小,但并没有减小它的容量。如果你的矢量在某一个时刻拥有十万个候选人,那么它的容量将继续保持在(至少)100000,即使后来其中只有10个元素。为了避免矢量仍占用不再需要的内存,我们希望有一种方法能把它的容量从以前的最大值缩减到当前需要的数量。这种对容量的缩减通常被称为“shrink to f原创 2014-06-24 22:44:00 · 1101 阅读 · 0 评论 -
关于typename和class的使用
一般情况下,是用typename还是用class纯粹是一个风格问题。但是在一种情况下,它就不是一个风格问题了。为了避免潜在的语法解析二义性,你需要在从属于形式类型参数的类型名前面使用typename。这样的类型被称为从属类型,用一个例子可以说明这一点。假设你要写一个函数模板,给它一个STL容器,它将返回容器中的最后一个元素是否大于第一个元素。下面是一种实现方式:template原创 2014-06-24 22:29:59 · 842 阅读 · 0 评论